How do I unit test code that includes a callout?












6














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.










share|improve this question



























    6














    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.










    share|improve this question

























      6












      6








      6


      3





      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.










      share|improve this question













      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 1 hour ago









      David Reed

      29.8k61746




      29.8k61746






















          1 Answer
          1






          active

          oldest

          votes


















          6














          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






          share|improve this answer























            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
            });


            }
            });














            draft saved

            draft discarded


















            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









            6














            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






            share|improve this answer




























              6














              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






              share|improve this answer


























                6












                6








                6






                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






                share|improve this answer














                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







                share|improve this answer














                share|improve this answer



                share|improve this answer








                answered 1 hour ago


























                community wiki





                David Reed































                    draft saved

                    draft discarded




















































                    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.




                    draft saved


                    draft discarded














                    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





















































                    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







                    Popular posts from this blog

                    Accessing regular linux commands in Huawei's Dopra Linux

                    Can't connect RFCOMM socket: Host is down

                    Kernel panic - not syncing: Fatal Exception in Interrupt