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
Andrew LikensAndrew Likens 

Unit Test for Web Service Callout and Custom Object

Hello,

I am trying to write a unit test for this class that makes a POST REST API callout. I also create a custom object based on the response I'm returning. I get 65%, but can't figure out how to get more code coverage. Any help is greatly appreciated!

Class:
global class AccountUpsert{
  @future (callout=true)
   public static void AccountUpdate(Id accountId) {
     //Construct HTTP request and response
     //Http request method,Endpoint and setBody
     String body = '["accounts"]';
     Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('http://dev-svc01.salesforce.signzoneinc.com:49831/v1/Account/' + accountId + '/Updated');
request.setMethod('POST');
request.setHeader('Content-Type', 'text/json');
request.setHeader('Content-Length', '0');
request.setBody(body);
request.setTimeout(120000);
HttpResponse response = http.send(request);

// Parse the JSON response
if (response.getStatusCode() > 399 || response == null) {
    System.debug('Status code returned was not expected: ' +
        response.getStatusCode() + ' ' + response.getStatus());
    
    Error_Object__c[] errobj = new List<Error_Object__c>();
    //Error_Object__c[] errobj = [SELECT Account__c, Account__r.Nav_Unique_ID__c FROM Error_Object__c];
    
    //Create new record for failed messages. Error_Object is a holding queue for failed messages.
    Error_Object__c newErrorObject = new Error_Object__c();
    newErrorObject.Account__c = accountId;
    errobj.add(newErrorObject);
    try {
        upsert errobj;
    } 
    catch (DmlException e) {
        System.debug(e.getMessage());
    }
}
       else if (response.getStatusCode() >= 200 && response.getStatusCode() < 398) {
           Error_Object__c[] errobj1 = [SELECT Account__c, Account__r.Nav_Unique_ID__c FROM Error_Object__c WHERE Account__c = :accountId];
           if (errobj1.size() > 0) {
           delete errobj1;
           }
       }
 }
}
HttpCalloutMockClass:
@isTest
global class MakeMockHttpResponse implements HttpCalloutMock {
    
    //implement HTTPResponse Method
    global HTTPResponse respond(HTTPRequest request) {
        System.assertEquals('POST', request.GetMethod());
        
        //create a fake response
        HttpResponse response = new HttpResponse();
        response.setHeader('Content-Type', 'text/json');
        response.setStatusCode(200);
        return response;
    }
}

Test Class I have so far:
 
@isTest
private class AccountUpsertTest {
    @isTest static void testCallout() {
        Test.setMock(HttpCalloutMock.Class, new MakeMockHttpResponse());
        
        Test.startTest();
        AccountUpsert.AccountUpdate('0015500000LVMRJ');
        Test.stopTest();
    }
    
    @isTest static void ErrorTest() {
        Test.startTest();
        Error_Object__c newErrorObject = new Error_Object__c();
        newErrorObject.Account__c = '0015500000LWoGS';
        newErrorObject.OwnerId = '005i0000001EYnX';
        try {
        upsert newErrorObject;
        }
        catch (DmlException e) {
           System.debug(e.getMessage());
        }
        newErrorObject = [SELECT Id, Account__c FROM Error_Object__c WHERE Id = :newErrorObject.Id];
        System.assertEquals('0015500000LWoGS', newErrorObject.Account__c);
        Test.stopTest();
    }
}