How do I unit test code that includes a callout?
This is a canonical question and answer developed by the community to help address common questions. If you've been directed here, or your question has been closed as a duplicate, please look through the resources here and use them to shape more specific questions. To browse all canonical questions and answers, including more unit test resources, navigate to the canonical-qa
tag.
How do I unit test code that includes a SOAP or REST-based callout, or indirectly calls code that makes a callout? I'm getting an error saying that callouts are not supported.
unit-test callout httpcalloutmock webservicemock canonical-qa
add a comment |
This is a canonical question and answer developed by the community to help address common questions. If you've been directed here, or your question has been closed as a duplicate, please look through the resources here and use them to shape more specific questions. To browse all canonical questions and answers, including more unit test resources, navigate to the canonical-qa
tag.
How do I unit test code that includes a SOAP or REST-based callout, or indirectly calls code that makes a callout? I'm getting an error saying that callouts are not supported.
unit-test callout httpcalloutmock webservicemock canonical-qa
add a comment |
This is a canonical question and answer developed by the community to help address common questions. If you've been directed here, or your question has been closed as a duplicate, please look through the resources here and use them to shape more specific questions. To browse all canonical questions and answers, including more unit test resources, navigate to the canonical-qa
tag.
How do I unit test code that includes a SOAP or REST-based callout, or indirectly calls code that makes a callout? I'm getting an error saying that callouts are not supported.
unit-test callout httpcalloutmock webservicemock canonical-qa
This is a canonical question and answer developed by the community to help address common questions. If you've been directed here, or your question has been closed as a duplicate, please look through the resources here and use them to shape more specific questions. To browse all canonical questions and answers, including more unit test resources, navigate to the canonical-qa
tag.
How do I unit test code that includes a SOAP or REST-based callout, or indirectly calls code that makes a callout? I'm getting an error saying that callouts are not supported.
unit-test callout httpcalloutmock webservicemock canonical-qa
unit-test callout httpcalloutmock webservicemock canonical-qa
asked Dec 27 '18 at 16:25
community wiki
David Reed
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
As part of the isolation of the test context, Salesforce does not allow your code to make REST or SOAP callouts during test execution. This includes all code that's executed in test context, even if it is executed indirectly by the code you're explicitly testing, and it includes callouts to Salesforce itself.
To test code that makes callouts, you must develop a Mock class, which mocks the remote server during the test and constructs an appropriate response that's returned to your code. Mock classes may generate a response in code (for example, by constructing objects, serializing them, and returning the resulting JSON), or by returning a result stored in a Static Resource.
Salesforce makes available two Mock interfaces (HttpCalloutMock
, for REST calls, and WebServiceMock
, for SOAP calls), as well as the StaticResourceCalloutMock
and MultiStaticResourceCalloutMock
implementations. You can use these built-in implementations to test your callouts by providing result data in a Static Resource, which the mock will return to your code in test context. Keep in mind that you must call Test.setMock()
to configure your mock in the test context prior to invoking the code that makes a callout.
In many cases, you'll need to use multiple Mock classes, returning different response bodies or status codes to exercise different logic paths in your code. Each unit test would supply an appropriate Mock for the code path whose behavior it's intended to test.
Mock classes are not required to test inbound REST and web service classes. Instead, the classes may be called directly (with appropriate inputs), in a way similar to testing other Apex code.
Resources
To learn how to develop Mock classes, complete these Trailhead modules:
Apex REST Callouts- Apex SOAP Callouts
For more in-depth information, explore these sections in the Apex Developer Guide:
- Testing HTTP Callouts
- Test Web Service Callouts
HttpCalloutMock
Interface
WebServiceMock
Interface
StaticResourceCalloutMock
Class
MultiStaticResourceCalloutMock
Class
Multiple mock classes can often be avoided by using dependency injection to the mock class' constructor allowing variable responses in therespond()
method
– cropredy
Dec 28 '18 at 2:23
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "459"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsalesforce.stackexchange.com%2fquestions%2f244797%2fhow-do-i-unit-test-code-that-includes-a-callout%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
As part of the isolation of the test context, Salesforce does not allow your code to make REST or SOAP callouts during test execution. This includes all code that's executed in test context, even if it is executed indirectly by the code you're explicitly testing, and it includes callouts to Salesforce itself.
To test code that makes callouts, you must develop a Mock class, which mocks the remote server during the test and constructs an appropriate response that's returned to your code. Mock classes may generate a response in code (for example, by constructing objects, serializing them, and returning the resulting JSON), or by returning a result stored in a Static Resource.
Salesforce makes available two Mock interfaces (HttpCalloutMock
, for REST calls, and WebServiceMock
, for SOAP calls), as well as the StaticResourceCalloutMock
and MultiStaticResourceCalloutMock
implementations. You can use these built-in implementations to test your callouts by providing result data in a Static Resource, which the mock will return to your code in test context. Keep in mind that you must call Test.setMock()
to configure your mock in the test context prior to invoking the code that makes a callout.
In many cases, you'll need to use multiple Mock classes, returning different response bodies or status codes to exercise different logic paths in your code. Each unit test would supply an appropriate Mock for the code path whose behavior it's intended to test.
Mock classes are not required to test inbound REST and web service classes. Instead, the classes may be called directly (with appropriate inputs), in a way similar to testing other Apex code.
Resources
To learn how to develop Mock classes, complete these Trailhead modules:
Apex REST Callouts- Apex SOAP Callouts
For more in-depth information, explore these sections in the Apex Developer Guide:
- Testing HTTP Callouts
- Test Web Service Callouts
HttpCalloutMock
Interface
WebServiceMock
Interface
StaticResourceCalloutMock
Class
MultiStaticResourceCalloutMock
Class
Multiple mock classes can often be avoided by using dependency injection to the mock class' constructor allowing variable responses in therespond()
method
– cropredy
Dec 28 '18 at 2:23
add a comment |
As part of the isolation of the test context, Salesforce does not allow your code to make REST or SOAP callouts during test execution. This includes all code that's executed in test context, even if it is executed indirectly by the code you're explicitly testing, and it includes callouts to Salesforce itself.
To test code that makes callouts, you must develop a Mock class, which mocks the remote server during the test and constructs an appropriate response that's returned to your code. Mock classes may generate a response in code (for example, by constructing objects, serializing them, and returning the resulting JSON), or by returning a result stored in a Static Resource.
Salesforce makes available two Mock interfaces (HttpCalloutMock
, for REST calls, and WebServiceMock
, for SOAP calls), as well as the StaticResourceCalloutMock
and MultiStaticResourceCalloutMock
implementations. You can use these built-in implementations to test your callouts by providing result data in a Static Resource, which the mock will return to your code in test context. Keep in mind that you must call Test.setMock()
to configure your mock in the test context prior to invoking the code that makes a callout.
In many cases, you'll need to use multiple Mock classes, returning different response bodies or status codes to exercise different logic paths in your code. Each unit test would supply an appropriate Mock for the code path whose behavior it's intended to test.
Mock classes are not required to test inbound REST and web service classes. Instead, the classes may be called directly (with appropriate inputs), in a way similar to testing other Apex code.
Resources
To learn how to develop Mock classes, complete these Trailhead modules:
Apex REST Callouts- Apex SOAP Callouts
For more in-depth information, explore these sections in the Apex Developer Guide:
- Testing HTTP Callouts
- Test Web Service Callouts
HttpCalloutMock
Interface
WebServiceMock
Interface
StaticResourceCalloutMock
Class
MultiStaticResourceCalloutMock
Class
Multiple mock classes can often be avoided by using dependency injection to the mock class' constructor allowing variable responses in therespond()
method
– cropredy
Dec 28 '18 at 2:23
add a comment |
As part of the isolation of the test context, Salesforce does not allow your code to make REST or SOAP callouts during test execution. This includes all code that's executed in test context, even if it is executed indirectly by the code you're explicitly testing, and it includes callouts to Salesforce itself.
To test code that makes callouts, you must develop a Mock class, which mocks the remote server during the test and constructs an appropriate response that's returned to your code. Mock classes may generate a response in code (for example, by constructing objects, serializing them, and returning the resulting JSON), or by returning a result stored in a Static Resource.
Salesforce makes available two Mock interfaces (HttpCalloutMock
, for REST calls, and WebServiceMock
, for SOAP calls), as well as the StaticResourceCalloutMock
and MultiStaticResourceCalloutMock
implementations. You can use these built-in implementations to test your callouts by providing result data in a Static Resource, which the mock will return to your code in test context. Keep in mind that you must call Test.setMock()
to configure your mock in the test context prior to invoking the code that makes a callout.
In many cases, you'll need to use multiple Mock classes, returning different response bodies or status codes to exercise different logic paths in your code. Each unit test would supply an appropriate Mock for the code path whose behavior it's intended to test.
Mock classes are not required to test inbound REST and web service classes. Instead, the classes may be called directly (with appropriate inputs), in a way similar to testing other Apex code.
Resources
To learn how to develop Mock classes, complete these Trailhead modules:
Apex REST Callouts- Apex SOAP Callouts
For more in-depth information, explore these sections in the Apex Developer Guide:
- Testing HTTP Callouts
- Test Web Service Callouts
HttpCalloutMock
Interface
WebServiceMock
Interface
StaticResourceCalloutMock
Class
MultiStaticResourceCalloutMock
Class
As part of the isolation of the test context, Salesforce does not allow your code to make REST or SOAP callouts during test execution. This includes all code that's executed in test context, even if it is executed indirectly by the code you're explicitly testing, and it includes callouts to Salesforce itself.
To test code that makes callouts, you must develop a Mock class, which mocks the remote server during the test and constructs an appropriate response that's returned to your code. Mock classes may generate a response in code (for example, by constructing objects, serializing them, and returning the resulting JSON), or by returning a result stored in a Static Resource.
Salesforce makes available two Mock interfaces (HttpCalloutMock
, for REST calls, and WebServiceMock
, for SOAP calls), as well as the StaticResourceCalloutMock
and MultiStaticResourceCalloutMock
implementations. You can use these built-in implementations to test your callouts by providing result data in a Static Resource, which the mock will return to your code in test context. Keep in mind that you must call Test.setMock()
to configure your mock in the test context prior to invoking the code that makes a callout.
In many cases, you'll need to use multiple Mock classes, returning different response bodies or status codes to exercise different logic paths in your code. Each unit test would supply an appropriate Mock for the code path whose behavior it's intended to test.
Mock classes are not required to test inbound REST and web service classes. Instead, the classes may be called directly (with appropriate inputs), in a way similar to testing other Apex code.
Resources
To learn how to develop Mock classes, complete these Trailhead modules:
Apex REST Callouts- Apex SOAP Callouts
For more in-depth information, explore these sections in the Apex Developer Guide:
- Testing HTTP Callouts
- Test Web Service Callouts
HttpCalloutMock
Interface
WebServiceMock
Interface
StaticResourceCalloutMock
Class
MultiStaticResourceCalloutMock
Class
edited Dec 27 '18 at 19:31
community wiki
2 revs, 2 users 98%
David Reed
Multiple mock classes can often be avoided by using dependency injection to the mock class' constructor allowing variable responses in therespond()
method
– cropredy
Dec 28 '18 at 2:23
add a comment |
Multiple mock classes can often be avoided by using dependency injection to the mock class' constructor allowing variable responses in therespond()
method
– cropredy
Dec 28 '18 at 2:23
Multiple mock classes can often be avoided by using dependency injection to the mock class' constructor allowing variable responses in the
respond()
method– cropredy
Dec 28 '18 at 2:23
Multiple mock classes can often be avoided by using dependency injection to the mock class' constructor allowing variable responses in the
respond()
method– cropredy
Dec 28 '18 at 2:23
add a comment |
Thanks for contributing an answer to Salesforce Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsalesforce.stackexchange.com%2fquestions%2f244797%2fhow-do-i-unit-test-code-that-includes-a-callout%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown