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
Venkatesh Ganta 16Venkatesh Ganta 16 

How to cover code Coverage for Apex rest Api

I am getting a NullPoint Exception on test class, any help will be appreciated.

My API Class:-

```
@RestResource (urlmapping = '/UpdateBill/*')
    global without sharing class ApiUpdateClass{
        
        @HttpPost
        global static void updateBill(OrderInfo oInfo){
            List<OrderDetail> objOrderDetail = oInfo.orderDt;
            Map<string,string> orderDetailMap=new Map<string,string>();
            List<Delivery_Order__c> upodateableList = new List<Delivery_Order__c>();
            if(objOrderDetail !=null && !objOrderDetail.isEmpty())
            {
                for(OrderDetail obj:objOrderDetail)
                {
                    orderDetailMap.put(obj.doNumber,obj.billNumber);
                }
                List<Delivery_Order__c> objOrderList = [Select id,Name,Bill_Number__c From Delivery_Order__c Where Name in :orderDetailMap.keySet()];
                for(Delivery_Order__c obj:objOrderList)
                {
                    if(orderDetailMap.containsKey(obj.Name))
                    {
                        obj.Bill_Number__c = orderDetailMap.get(obj.Name);
                        obj.Status__c ='Bill Generated';
                        upodateableList.add(obj);
                    }    
                }              
                if(!upodateableList.isEmpty())
                {
                    database.update(upodateableList);
                    RestContext.response.responseBody = Blob.valueOf('{"success":"Update successfully"}');
                }        
            }
            else
            {
                RestContext.response.responseBody = Blob.valueOf('{"error":"There is something went wrong"}');
            }    
            // RestContext.response.responseBody = Blob.valueOf('{"error":"'+objOrderDetailList+'"}');*/
        }
        
        global class  OrderDetail{
            global string billNumber;
            global string doNumber;
            
        }
         global class OrderInfo{
           List<OrderDetail> orderDt { get; set; }
        }
    }
```

Test Class:-
```
@isTest
@isTest
public class ApiUpdateClass_Test {
    
    Public static testmethod void setup() {
        Test.startTest();
        RestRequest request = new RestRequest();
        RestResponse res = new RestResponse();
        request.requestUri ='https://uat-restexplorer.cs32.force.com/services/apexrest/UpdateBill';
        request.httpMethod = 'POST';
        request.addHeader('Content-Type', 'Test/xml');
        RestContext.request = request;
        RestContext.response = res;
        
        ApiUpdateClass.OrderInfo oinfor = new ApiUpdateClass.OrderInfo();
        ApiUpdateClass.OrderDetail od= new ApiUpdateClass.OrderDetail();
        
        od.doNumber='123';
        od.billNumber='234';
        
        //Delivery_Order__c dod =ApiUpdateClass.updateBill(oinfor);
        ApiUpdateClass.updateBill(oinfor);
        System.assertEquals('234', od.billNumber);
        Test.stopTest();
    }
}
```

User-added image
Best Answer chosen by Venkatesh Ganta 16
Suraj Tripathi 47Suraj Tripathi 47
Hi Venkatesh Ganta 16,

As you referred Name is the auto number field, I have updated the test class for that. Please refer to the below code, your code coverage will definitely improve. Please mark it as the best answer.

Apex Class:
@RestResource (urlmapping = '/UpdateBill/*')
global without sharing class ApiUpdateClass{
    
    @HttpPost
    global static void updateBill(OrderInfo oInfo){
        try{
            List<OrderDetail> objOrderDetail = oInfo.orderDt;
            Map<string,string> orderDetailMap=new Map<string,string>();
            List<Delivery_Order__c> upodateableList = new List<Delivery_Order__c>();
            if(objOrderDetail !=null && !objOrderDetail.isEmpty())
            {
                for(OrderDetail obj:objOrderDetail)
                {
                    orderDetailMap.put(obj.doNumber,obj.billNumber);
                }
                List<Delivery_Order__c> objOrderList = new List<Delivery_Order__c>();
                
                objOrderList = [Select id,Name,Bill_Number__c From Delivery_Order__c Where Name in :orderDetailMap.keySet()];
                
                for(Delivery_Order__c obj:objOrderList)
                {
                    if(orderDetailMap.containsKey(obj.Name))
                    {
                        obj.Bill_Number__c = orderDetailMap.get(obj.Name);
                        obj.Status__c ='Bill Generated';
                        upodateableList.add(obj);
                    }    
                }              
                if(!upodateableList.isEmpty())
                {
                    database.update(upodateableList);
                    RestContext.response.responseBody = Blob.valueOf('{"success":"Update successfully"}');
                }        
            }
            else
            {
                RestContext.response.responseBody = Blob.valueOf('{"error":"There is something went wrong"}');
            }    
            // RestContext.response.responseBody = Blob.valueOf('{"error":"'+objOrderDetailList+'"}');*/
            
        }
        catch(Exception e){
            System.debug('error >> '+e.getMessage()+'at line >> '+e.getLineNumber());
        }
        
    }
    
    global class  OrderDetail{
        global string billNumber;
        global string doNumber;
        
    }
    global class OrderInfo{
        global List<OrderDetail> orderDt { get; set; }
    }
}
Test Class : 
@isTest
public class ApiUpdateClass_Test {
 
    public static testmethod void setup() {
        Test.startTest();
        RestRequest request = new RestRequest();
        RestResponse res = new RestResponse();
        request.requestUri ='https://uat-restexplorer.cs32.force.com/services/apexrest/UpdateBill';
        request.httpMethod = 'POST';
        request.addHeader('Content-Type', 'Test/xml');
        RestContext.request = request;
        RestContext.response = res;
        
        ApiUpdateClass.OrderInfo oinfor = new ApiUpdateClass.OrderInfo();
        ApiUpdateClass.OrderDetail od= new ApiUpdateClass.OrderDetail();
        List<ApiUpdateClass.OrderDetail> OrderDetailList = new List<ApiUpdateClass.OrderDetail>();
        
        Delivery_Order__c oderObj = new Delivery_Order__c();
        oderObj.Bill_Number__c = '234';
       // oderObj.Name = '123';
        oderObj.Pincode__c= '123233';
        oderObj.From_Address__c = 'Banipark,Jaipur-302016';
        oderObj.To_Address__c='AJMER NH-8';
        oderObj.Date_Of_Delivery__c = system.today();
        oderObj.Status__c = 'Sent to Tally';
        oderObj.GST__c = '24AAACC1206D1ZM';
        insert oderObj;
        oderObj = [Select id ,Name,Bill_Number__c,Pincode__c,From_Address__c,To_Address__c,Date_Of_Delivery__c,Status__c,GST__c from Delivery_Order__c where Bill_Number__c = '234' LIMIT 1 ];
        System.debug('orderOBJ>>'+oderObj);
        od.doNumber=oderObj.Name;
        od.billNumber='234';
        OrderDetailList.add(od);

        oinfor.orderDt = OrderDetailList;
        
        //Delivery_Order__c dod =ApiUpdateClass.updateBill(oinfor);
        ApiUpdateClass.updateBill(oinfor);
        System.assertEquals('234', od.billNumber);
        Test.stopTest();
    }
}
I hope you find the above solution helpful. If it does, please mark it as Best Answer to help others too.

Thanks and Regards,
Suraj Tripathi
 

All Answers

Suraj Tripathi 47Suraj Tripathi 47
Hi Venkatesh Ganta 16,

I have updated your test class and apex for web service, please update your code accordingly.

Apex Class:
@RestResource (urlmapping = '/UpdateBill/*')
    global without sharing class ApiUpdateClass{
        
        @HttpPost
        global static void updateBill(OrderInfo oInfo){
            try{
                 List<OrderDetail> objOrderDetail = oInfo.orderDt;
            Map<string,string> orderDetailMap=new Map<string,string>();
            List<Delivery_Order__c> upodateableList = new List<Delivery_Order__c>();
            if(objOrderDetail !=null && !objOrderDetail.isEmpty())
            {
                for(OrderDetail obj:objOrderDetail)
                {
                    orderDetailMap.put(obj.doNumber,obj.billNumber);
                }
                List<Delivery_Order__c> objOrderList = [Select id,Name,Bill_Number__c From Delivery_Order__c Where Name in :orderDetailMap.keySet()];
                for(Delivery_Order__c obj:objOrderList)
                {
                    if(orderDetailMap.containsKey(obj.Name))
                    {
                        obj.Bill_Number__c = orderDetailMap.get(obj.Name);
                        obj.Status__c ='Bill Generated';
                        upodateableList.add(obj);
                    }    
                }              
                if(!upodateableList.isEmpty())
                {
                    database.update(upodateableList);
                    RestContext.response.responseBody = Blob.valueOf('{"success":"Update successfully"}');
                }        
            }
            else
            {
                RestContext.response.responseBody = Blob.valueOf('{"error":"There is something went wrong"}');
            }    
            // RestContext.response.responseBody = Blob.valueOf('{"error":"'+objOrderDetailList+'"}');*/

            }
            catch(Exception e){
                System.debug('error >> '+e.getMessage()+'at line >> '+e.getLineNumber());
            }
            
         }
        
        global class  OrderDetail{
            global string billNumber;
            global string doNumber;
            
        }
         global class OrderInfo{
          global List<OrderDetail> orderDt { get; set; }
        }
    }

Test Class :
@isTest
public class ApiUpdateClass_Test {
 
    public static testmethod void setup() {
        Test.startTest();
        RestRequest request = new RestRequest();
        RestResponse res = new RestResponse();
        request.requestUri ='https://uat-restexplorer.cs32.force.com/services/apexrest/UpdateBill';
        request.httpMethod = 'POST';
        request.addHeader('Content-Type', 'Test/xml');
        RestContext.request = request;
        RestContext.response = res;
        
        ApiUpdateClass.OrderInfo oinfor = new ApiUpdateClass.OrderInfo();
        ApiUpdateClass.OrderDetail od= new ApiUpdateClass.OrderDetail();
        List<ApiUpdateClass.OrderDetail> OrderDetailList = new List<ApiUpdateClass.OrderDetail>();
        
        Delivery_Order__c oderObj = new Delivery_Order__c();
        oderObj.Bill_Number__c = '234';
        oderObj.Name = '123';
        insert oderObj;
        od.doNumber='123';
        od.billNumber='234';
        OrderDetailList.add(od);

        oinfor.orderDt = OrderDetailList;
        
        //Delivery_Order__c dod =ApiUpdateClass.updateBill(oinfor);
        ApiUpdateClass.updateBill(oinfor);
        System.assertEquals('234', od.billNumber);
        Test.stopTest();
    }
}



I hope you find the above solution helpful. If it does, please mark it as Best Answer to help others too.

Thanks and Regards,
Suraj Tripathi
Venkatesh Ganta 16Venkatesh Ganta 16

@Suraj  Thanks for your updated code, the code which you shared is still covering only 57%, here Name is the Auto Number field so it is non writable field so i update my code as below, can you please check.

Test Class:-

@isTest
public class ApiUpdateClass_Test {
 
    public static testmethod void setup() {
        Test.startTest();
        RestRequest request = new RestRequest();
        RestResponse res = new RestResponse();
        request.requestUri ='https://uat-restexplorer.cs32.force.com/services/apexrest/UpdateBill';
        request.httpMethod = 'POST';
        request.addHeader('Content-Type', 'Test/xml');
        RestContext.request = request;
        RestContext.response = res;
        
        ApiUpdateClass.OrderInfo oinfor = new ApiUpdateClass.OrderInfo();
        ApiUpdateClass.OrderDetail od= new ApiUpdateClass.OrderDetail();
        List<ApiUpdateClass.OrderDetail> OrderDetailList = new List<ApiUpdateClass.OrderDetail>();
        
        Delivery_Order__c oderObj = new Delivery_Order__c();
        oderObj.Bill_Number__c = '234';
       // oderObj.Name = '123';
        oderObj.Pincode__c= '123233';
        oderObj.From_Address__c = 'Banipark,Jaipur-302016';
        oderObj.To_Address__c='AJMER NH-8';
        oderObj.Date_Of_Delivery__c = system.today();
        oderObj.Status__c = 'Sent to Tally';
        oderObj.GST__c = '24AAACC1206D1ZM';
        insert oderObj;
        od.doNumber=oderObj.Name;
        od.billNumber='234';
        OrderDetailList.add(od);


        oinfor.orderDt = OrderDetailList;
        
        //Delivery_Order__c dod =ApiUpdateClass.updateBill(oinfor);
        ApiUpdateClass.updateBill(oinfor);
        System.assertEquals('234', od.billNumber);
        Test.stopTest();
    }
}
User-added image

Suraj Tripathi 47Suraj Tripathi 47
Hi Venkatesh Ganta 16,

As you referred Name is the auto number field, I have updated the test class for that. Please refer to the below code, your code coverage will definitely improve. Please mark it as the best answer.

Apex Class:
@RestResource (urlmapping = '/UpdateBill/*')
global without sharing class ApiUpdateClass{
    
    @HttpPost
    global static void updateBill(OrderInfo oInfo){
        try{
            List<OrderDetail> objOrderDetail = oInfo.orderDt;
            Map<string,string> orderDetailMap=new Map<string,string>();
            List<Delivery_Order__c> upodateableList = new List<Delivery_Order__c>();
            if(objOrderDetail !=null && !objOrderDetail.isEmpty())
            {
                for(OrderDetail obj:objOrderDetail)
                {
                    orderDetailMap.put(obj.doNumber,obj.billNumber);
                }
                List<Delivery_Order__c> objOrderList = new List<Delivery_Order__c>();
                
                objOrderList = [Select id,Name,Bill_Number__c From Delivery_Order__c Where Name in :orderDetailMap.keySet()];
                
                for(Delivery_Order__c obj:objOrderList)
                {
                    if(orderDetailMap.containsKey(obj.Name))
                    {
                        obj.Bill_Number__c = orderDetailMap.get(obj.Name);
                        obj.Status__c ='Bill Generated';
                        upodateableList.add(obj);
                    }    
                }              
                if(!upodateableList.isEmpty())
                {
                    database.update(upodateableList);
                    RestContext.response.responseBody = Blob.valueOf('{"success":"Update successfully"}');
                }        
            }
            else
            {
                RestContext.response.responseBody = Blob.valueOf('{"error":"There is something went wrong"}');
            }    
            // RestContext.response.responseBody = Blob.valueOf('{"error":"'+objOrderDetailList+'"}');*/
            
        }
        catch(Exception e){
            System.debug('error >> '+e.getMessage()+'at line >> '+e.getLineNumber());
        }
        
    }
    
    global class  OrderDetail{
        global string billNumber;
        global string doNumber;
        
    }
    global class OrderInfo{
        global List<OrderDetail> orderDt { get; set; }
    }
}
Test Class : 
@isTest
public class ApiUpdateClass_Test {
 
    public static testmethod void setup() {
        Test.startTest();
        RestRequest request = new RestRequest();
        RestResponse res = new RestResponse();
        request.requestUri ='https://uat-restexplorer.cs32.force.com/services/apexrest/UpdateBill';
        request.httpMethod = 'POST';
        request.addHeader('Content-Type', 'Test/xml');
        RestContext.request = request;
        RestContext.response = res;
        
        ApiUpdateClass.OrderInfo oinfor = new ApiUpdateClass.OrderInfo();
        ApiUpdateClass.OrderDetail od= new ApiUpdateClass.OrderDetail();
        List<ApiUpdateClass.OrderDetail> OrderDetailList = new List<ApiUpdateClass.OrderDetail>();
        
        Delivery_Order__c oderObj = new Delivery_Order__c();
        oderObj.Bill_Number__c = '234';
       // oderObj.Name = '123';
        oderObj.Pincode__c= '123233';
        oderObj.From_Address__c = 'Banipark,Jaipur-302016';
        oderObj.To_Address__c='AJMER NH-8';
        oderObj.Date_Of_Delivery__c = system.today();
        oderObj.Status__c = 'Sent to Tally';
        oderObj.GST__c = '24AAACC1206D1ZM';
        insert oderObj;
        oderObj = [Select id ,Name,Bill_Number__c,Pincode__c,From_Address__c,To_Address__c,Date_Of_Delivery__c,Status__c,GST__c from Delivery_Order__c where Bill_Number__c = '234' LIMIT 1 ];
        System.debug('orderOBJ>>'+oderObj);
        od.doNumber=oderObj.Name;
        od.billNumber='234';
        OrderDetailList.add(od);

        oinfor.orderDt = OrderDetailList;
        
        //Delivery_Order__c dod =ApiUpdateClass.updateBill(oinfor);
        ApiUpdateClass.updateBill(oinfor);
        System.assertEquals('234', od.billNumber);
        Test.stopTest();
    }
}
I hope you find the above solution helpful. If it does, please mark it as Best Answer to help others too.

Thanks and Regards,
Suraj Tripathi
 
This was selected as the best answer