[SalesForce] Test class for a controller – Unable to set the variable in the constructor

I have a controller:

public class XYZcontroller{
    public object__c sr{get;set;}
    public String srid;
    public XYZcontroller(ApexPages.StandardController controller) {
        sr = (object__c) controller.getRecord();
        srid = String.valueOf(sr.Id).substring(0, 15);
        String pageMessage = ApexPages.currentPage().getParameters().get('pageMessage');
        boolean doNotDisplay;
        String referrer = ApexPages.currentPage().getHeaders().get('REFERER');
        if(referrer.contains(srid+ '/e')){
            doNotDisplay=false;
        }else{
            doNotDisplay=true;
        }
    }
}

Test class for the above:

@isTest
public class xyzControllerTest{        
    static testMethod void testMethod1(){        
        object__c sr = new object__c (Name='test');
        insert sr;
        PageReference pageRef = Page.Thepage;
        Test.setCurrentPage(pageRef);
        ApexPages.currentPage().getParameters().put('pageMessage', 'Amessage');     
        ApexPages.currentPage().getHeaders().put('REFERER', sr.id + '/e');
        ApexPages.StandardController stdcontroller = new ApexPages.StandardController(sr);

        xyzController controller = new xyzController(stdcontroller);     
    }    
}

In the above test class I get an error at line – xyzController controller = new xyzController(stdcontroller); saying:

Error Message:

System.NullPointerException: Argument 1 cannot be null Stack Trace External entry point Class.xyzControllerTest.testMethod1: line 14, column 1

I am thinking it is due to the public String srid; in the XYZcontroller which does not get a value inside the constructor. ( srid = String.valueOf(sr.Id).substring(0, 15); )

Best Answer

Since you are not passing REFERER as parameter which you are trying to access in the constructor, that's why the error is.

So, before creating instance of the stdController, assign header value.

@isTest
public class xyzControllerTest{


 static testMethod void testMethod1(){

     object__c sr = new object__c (Name='test');
     insert sr;
     PageReference pageRef = Page.Thepage;
     Test.setCurrentPage(pageRef);
     ApexPages.currentPage().getParameters().put('id',sr.Id);
     ApexPages.currentPage().getParameters().put('pageMessage', 'Amessage');  
     ApexPages.currentPage().getHeaders().put('REFERER', sr.id + '/e');  
     ApexPages.StandardController stdcontroller = new ApexPages.StandardController(sr);

     xyzController controller = new xyzController(stdcontroller);     
 }

}

Controller

Also, put a null check before using referrer

public class XYZcontroller{
public object__c sr{get;set;}
public String srid {get;set;}
public XYZcontroller(ApexPages.StandardController controller) 
{
    sr = (object__c) controller.getRecord();
    srid = String.valueOf(controller.getId()).substring(0, 15);
    String pageMessage = ApexPages.currentPage().getParameters().get('pageMessage');
    boolean doNotDisplay;

    String referrer = ApexPages.currentPage().getHeaders().get('REFERER');
    if(referrer !=null && referrer.contains(srid+ '/e'))
    {
        doNotDisplay = false;
    }else
    {
        doNotDisplay=true;
    }
}
Related Topic