function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Shovan Mandal 14Shovan Mandal 14 

Error in Test class of Apex Rest Callouts

Hi All,

Trying to solve the trailhead of "Apex REST Callouts". Copied the code of "Test a Callout with StaticResourceCalloutMock"

Apex Class Code follows:-

public class AnimalsCallouts {

    public static HttpResponse makeGetCallout() {
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals');
        request.setMethod('GET');
        HttpResponse response = http.send(request);
        // If the request is successful, parse the JSON response.
        if (response.getStatusCode() == 200) {
            // Deserializes the JSON string into collections of primitive data types.
            Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
            // Cast the values in the 'animals' key as a list
            List<Object> animals = (List<Object>) results.get('animals');
            System.debug('Received the following animals:');
            for (Object animal: animals) {
                System.debug(animal);
            }
        }
        return response;
    }

    public static HttpResponse makePostCallout() {
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals');
        request.setMethod('POST');
        request.setHeader('Content-Type', 'application/json;charset=UTF-8');
        request.setBody('{"name":"mighty moose"}');
        HttpResponse response = http.send(request);
        // Parse the JSON response
        if (response.getStatusCode() != 201) {
            System.debug('The status code returned was not expected: ' +
                response.getStatusCode() + ' ' + response.getStatus());
        } else {
            System.debug(response.getBody());
        }
        return response;
    }        

}

Static resource follows:-
{"animals": ["pesky porcupine", "hungry hippo", "squeaky squirrel"]}

Test Class follows:-

@isTest
private class AnimalsCalloutsTest {

    @isTest static  void testGetCallout() {
        // Create the mock response based on a static resource
        StaticResourceCalloutMock mock = new StaticResourceCalloutMock();
        mock.setStaticResource('GetAnimalResource');
        mock.setStatusCode(200);
        mock.setHeader('Content-Type', 'application/json;charset=UTF-8');
        // Associate the callout with a mock response
        Test.setMock(HttpCalloutMock.class, mock);
        // Call method to test
        HttpResponse result = AnimalsCallouts.makeGetCallout();
        // Verify mock response is not null
        System.assertNotEquals(null,result,
            'The callout returned a null response.');
        // Verify status code
        System.assertEquals(200,result.getStatusCode(),
          'The status code is not 200.');
        // Verify content type   
        System.assertEquals('application/json;charset=UTF-8',
          result.getHeader('Content-Type'),
          'The content type value is not expected.');  
        // Verify the array contains 3 items     
        Map<String, Object> results = (Map<String, Object>) 
            JSON.deserializeUntyped(result.getBody());
        List<Object> animals = (List<Object>) results.get('animals');
        System.assertEquals(3, animals.size(),
          'The array should only contain 3 items.');          
    }   

}

But while saving the code for test class it's throwing a compilation error, stating:-
"Method does not exist or incorrect signature: void setMock(System.Type, System.StaticResourceCalloutMock) from the type test"

Request you to guide me with this. Thanks in advance!
v varaprasadv varaprasad
Hi Shovan,

First we need to create HttpCalloutMock ​interface. 
@isTest
global class MockHttpResponseGenerator implements HttpCalloutMock {
    // Implement this interface method
    global HTTPResponse respond(HTTPRequest req) {
        // Optionally, only send a mock response for a specific endpoint
        // and method.
        System.assertEquals('http://api.salesforce.com/foo/bar', req.getEndpoint());
        System.assertEquals('GET', req.getMethod());
        
        // Create a fake response
        HttpResponse res = new HttpResponse();
        res.setHeader('Content-Type', 'application/json');
        res.setBody('{"foo":"bar"}');
        res.setStatusCode(200);
        return res;
    }
}

Please let me know you have already above class or not.

Thanks
Varaprasad

 
Tej PalTej Pal
Hi Shovan,

Check have you created 'GetAnimalResource' with approriate JSON file.

If this answers your question mark Best Answer it as solution and then hit Like!

 
Shovan Mandal 14Shovan Mandal 14
Hi Varaprasad,

But according to the trailhead module "To test your callouts, use mock callouts by either implementing an interface or using static resources." So I have created a static resource instead of implementing an interface.

Thanks 
Shovan
Shovan Mandal 14Shovan Mandal 14
Hi Tej,

I have created the static resource 'GetAnimalResource' also. You can check the static resource in the code snippet as well.

Thanks,
Shovan
Aman MalikAman Malik
Hi Shovan,

Can you please make sure, you don't have an apex class with the name 'Test' in your org. If you have, kindly delete that first and give your test class one more try.

If this answers your question mark Best Answer it as solution and then hit Like!

Thanks,
Aman
Shovan Mandal 14Shovan Mandal 14
Hi Aman,

I have deleted the test class and created another one without appending "test" in the class name, even though its not working.

Regards,
Shovan