1

I have some code in an extension that works fine when it runs on the record, but I'm getting a strange null value on a relationship field when running the test class. This code runs on a button click, not update/insert.

Test Class

@isTest
Public class BuildPartnerProductsTest {
    public static TestMethod void testthethings(){ 

        Contact c   = new Contact();
        c.LastName  = 'Greene';
        //Other required fields
        insert c;

        Lead l      = new Lead();
        l.LastName  = 'Greene';
        l.Company   = 'Company Name';
        l.Contact__c= c.Id;  //Custom lookup field to the contact
        l.Subject__c= 'Biology';
        insert l;
        system.debug('TestContactID: '+l.Contact__c);

        test.startTest();

        PageReference pageRef = Page.ActionPage;
        test.setCurrentPage(pageRef);
        pageRef.getParameters().put('id',l.Id);
        ApexPages.StandardController sc = new ApexPages.StandardController(l);

        BuildPartnerProducts Controller = new BuildPartnerProducts(sc);
        Controller.doSomething();

        test.stopTest();
    }
}

Extension

public with sharing class BuildPartnerProducts
{
    public ApexPages.StandardController standardController;
    public BuildPartnerProducts(ApexPages.StandardController standardController)
    {
        this.standardController = standardController;
    }    
    public PageReference doSomething()
    {
        Id recordId = standardController.getId();
        Lead l = [SELECT Id, Contact__c, Subject__c FROM Lead WHERE ID=:recordID];
        system.debug('ExtContactID: '+l.Contact__c);
    }
}

VF Page

<apex:page standardController="Lead"
       extensions="BuildPartnerProducts"
       action="{!doSomething}">
</apex:page>

The debug in the test has the contact ID, but the debug in the Extension is null. It is odd to me that the subject DOES get populated in the extension correctly.

I've tried using Contact__r.ID in the debug and that didn't work. I wasn't able to do it in the query.

6
  • 1
    That code would break as soon as you add a second Lead to the system. Please edit your post to include your test.
    – Adrian Larson
    Commented Oct 13, 2017 at 3:04
  • @AdrianLarson Oh yea, I noticed that, updated it in my code, but then forgot to update it here. You want the entire test class? It's pretty big. Or do you mean the part of the test that runs the extension? Commented Oct 13, 2017 at 3:14
  • @AdrianLarson I've added everything necessary to reproduce the issue, and then some. I hope it helps. Commented Oct 13, 2017 at 3:49
  • 1
    Do you have any triggers clearing this field out by chance?
    – Adrian Larson
    Commented Oct 13, 2017 at 3:50
  • @AdrianLarson. That was it! I had some other automation that I thought I had bypassed but I actually had not. I definitely should have caught this. Thanks for the reminder. Should I delete this question? It doesn't seem useful to anyone else. Commented Oct 13, 2017 at 4:00

2 Answers 2

2

The most likely problem here is that you have a trigger clearing out the field. Always double check your trigger logic in cases like this. See also: How do I start to debug my own Apex code?

0

I had the exact same issue. In my case, I was populating the campaign lookup field on the opportunity. My mistake was that I was setting the field as follows

opportunity.Campaign = campaignRecord;

This would work ok when printing the opportunity object in the debug, but later in the tests it was null.

I should have used the CampaignId as follows

opportunity.CampaignId = campaignRecord.Id;

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .