You need to sign in to do that
Don't have an account?
System.NullPointerException: Attempt to de-reference a null object
Apex Test Result Detail
Class.QuoteManager_Test.invokeTestMethod: line 41, column 1
Please advice me what should I do to successfully run my test case.
===================================================================================
public with sharing class QuoteManager {
/* REPLACES trigger QuoteFieldUpdates on Quote__c (before insert, before update)*/
private static List<Opportunity> OppList;
public static List<Opportunity> getOppISVTeamMembersDetails(Set<Id> opportunityIds)
{
if (OppList == null){
OppList = [SELECT Partner_CBM__c, End_User_Account_Owner__c FROM Opportunity WHERE Id in:opportunityIds];
}
return OppList;
}
private static List<Quote_Part__c > QuotePartsList;
public static List<Quote_Part__c> getQuotePartsDetails(Set<Id> requiredQuoteIDs)
{
if (QuotePartsList == null){
QuotePartsList = [SELECT Product_Category__c,
Margin_Percent__c,Product_Code__c,
Quote_Ref__c,Margin_Net_Dollars__c,CurrencyISOCode
FROM Quote_Part__c
WHERE Quote_Ref__c =: requiredQuoteIDs
AND Product_Category__c != 'Multi Product Accessory'
AND Product_Category__c != 'Media'
AND Product_Category__c != 'Service'
AND Product_Category__c != 'Software'
AND Product_Category__c != 'ProductLinks'
AND Product_Category__c != 'OEM'
AND Margin_Net_Dollars__c != null
ORDER BY Margin_Net_Dollars__c];
}
return QuotePartsList;
}
public static void updatePartnerCBMDetails(List<Quote__C> newQuote)
{
Map<Id, Opportunity> oppMap = new Map<Id, Opportunity>();
List<Opportunity> oppsData = new List<Opportunity>();
Set<ID> opportunityIds = new Set<ID>(); // this line I am getting an error while running the test case.
if (trigger.isUpdate && !QuotePartManager.isInsert)
{
for (Quote__c quote :newQuote)
{
opportunityIds.add(quote.Opportunity_Name__c);
}
/*oppsData = [SELECT Partner_CBM__c, End_User_Account_Owner__c FROM Opportunity WHERE Id in :opportunityIds];*/
oppsData =getOppISVTeamMembersDetails(opportunityIds);
for(Opportunity opp : oppsData) {
oppMap.put(opp.Id, opp);
}
}
for (Quote__c quote :newQuote)
{
if (trigger.isInsert)
{
quote.Owner_Lookup__c = quote.OwnerID;
}
if (trigger.isUpdate)
{
if(quote.Owner_Lookup__c != quote.OwnerId)
{
quote.Owner_Lookup__c = quote.OwnerID;
}
if(oppMap.get(quote.Opportunity_Name__c) != null)
{
if(oppMap.get(quote.Opportunity_Name__c).Partner_CBM__c != quote.Partner_CBM__c)
{
quote.Partner_CBM__c = oppMap.get(quote.Opportunity_Name__c).Partner_CBM__c;
}
if(oppMap.get(quote.Opportunity_Name__c).End_User_Account_Owner__c != quote.End_User_Account_Owner__c)
{
quote.End_User_Account_Owner__c = oppMap.get(quote.Opportunity_Name__c).End_User_Account_Owner__c;
}
}
}
}
}
/* REPLACES trigger QuoteBeforeDelete on Quote__c (before delete)*/
public static void QuoteBeforeDelete(List<Quote__c> oldQuotes)
{
for (Quote__c quote : oldQuotes)
{
if (quote.Main_Quote__c)
{
if(!Test.isRunningTest())
{
quote.addError('You cannot delete a Main Quote. Uncheck the Main Quote checkbox on the Quote prior to deleting.');
}
}
}
}
/*
REPLACES trigger populateMarginsFromQuoteParts on Quote__c (before update)
Trigger to assign field values "Lowest_Margin_Percent__c" and "Highest_Margin_Net_Value__c" on EDIT of a Quote:
IF(Quote__c.Quote_Type__c EQUALS 'Hardware' AND PE.Approval_Stage__c EQUALS 'In Review')
ONE:
o Evaluate all HW Quote Parts WHERE Product_Category__c NOT EQUALS Media, Service, Software, ProductLinks, OEM:
o return item with lowest overall margin percentage (Margin_Percent__c)
o Capture that Item's corresponding Product_Code__c, Margin_Net_Dollars__c, and Margin_Percent__c into text field(s) on the Quote
TWO:
o Evaluate all HW Quote Parts WHERE Product_Category__c NOT EQUALS Multi Product Accessory, Media, Service, Software, ProductLinks, OEM:
o return item with highest total margin dollar value (Margin_Net__Dollars__c) that has the lowest margin percentage (Margin_Percent__c)
o Capture that Item's corresponding Product_Code__c, Margin_Net_Dollars__c, and Margin_Percent__c into text field(s) on the Quote
*/
public static void populateMarginsFromQuoteParts(List<Quote__c> newQuotes)
{
/*Set of Quote IDs for which the Margins from Quote Parts should be calculated*/
Set<Id> requiredQuoteIDs = new Set<Id>();
Quote__c[] Quotes = new Quote__c[]{};
for(Integer i=0; i < newQuotes.size(); i++)
{
if(newQuotes[i].HW_Approval_Stage__c == 'In Review')
{
system.debug('Approval is IN REVIEW');
requiredQuoteIDs.add(newQuotes[i].Id);
Quotes.add(newQuotes[i]);
}
}
/*
Map of Quote ID and List of Quote Parts under that Quote - Lowest Margin Percent
*/
Map<Id,List<Quote_Part__c>> quotePartsMapLowestMarginPercent = new Map<Id,List<Quote_Part__c>>();
/*
Map of Quote ID and List of Quote parts under that Quote - HIghest Margin Dollar Value
*/
Map<Id,List<Quote_Part__c>> quotePartsMapHighestMarginValue = new Map<Id,List<Quote_Part__c>>();
/*
Query through all Line Items (WHERE Product_Category__c NOT EQUALS Media,
Service, Software, ProductLinks, OEM)
*/
if (!requiredQuoteIDs.isEmpty()){
system.debug('requiredQuoteIDs contains ID');
/*
FIRST ELEMENT --> LOWEST MARGIN PERCENT*
*/
for(Quote_Part__c qpLi:getQuotePartsDetails(requiredQuoteIDs))
{
if(quotePartsMapLowestMarginPercent.get(qpLi.Quote_Ref__c) == null)
{
quotePartsMapLowestMarginPercent.put(qpLi.Quote_Ref__c, new List<Quote_Part__c>{ qpLi });
}
else
{
quotePartsMapLowestMarginPercent.get(qpLi.Quote_Ref__c).add(qpLi);
}
}
system.debug('LowestMarginPercent map size is '+quotePartsMapLowestMarginPercent.size());
/*
Query through all Quote Parts (WHERE Product_Category__c NOT EQUALS Multi Product Accessory, Media, Service, Software, ProductLinks, OEM)
*/
for(Quote_Part__c qpLi:getQuotePartsDetails(requiredQuoteIDs))
{
if(quotePartsMapHighestMarginValue.get(qpLi.Quote_Ref__c) == null)
{
quotePartsMapHighestMarginValue.put(qpLi.Quote_Ref__c, new List<Quote_Part__c>{ qpLi });
}
else
{
quotePartsMapHighestMarginValue.get(qpLi.Quote_Ref__c).add(qpLi);
}
}
system.debug('HighestMarginValue map size is '+quotePartsMapHighestMarginValue.size());
}
/*Loop through Price Exceptions being updated and assign Value*/
if (!Quotes.isEmpty())
{
system.debug('Quotes Loop begins');
for(Quote__c Quote: Quotes)
{
if(quotePartsMapLowestMarginPercent.get(Quote.Id) != null && quotePartsMapLowestMarginPercent.get(Quote.Id).size() > 0)
{
system.debug('Lowest Percent Margin Percent is '+quotePartsMapLowestMarginPercent.get(Quote.Id)[0].Margin_Percent__c);
String marginValueFormat = quotePartsMapLowestMarginPercent.get(Quote.Id)[0].Margin_Net_Dollars__c.format();
system.debug('Lowest Percent marginNetDollars is '+quotePartsMapLowestMarginPercent.get(Quote.Id)[0].Margin_Net_Dollars__c.format());
system.debug('Lowest Percent marginValueFormat is '+marginValueFormat);
if(marginValueFormat.contains('.'))
{
List<String> marginDecimals = marginValueFormat.split('\\.');
if(marginDecimals.size() == 2)
{
if(marginDecimals[1].length() == 1)
{
marginValueFormat = marginValueFormat + '0';
}
}
}
else
{
marginValueFormat = marginValueFormat + '.00';
}
String lowestMarginPercent = 'P/N ' + String.valueOf(quotePartsMapLowestMarginPercent.get(Quote.Id)[0].Product_Code__c) +
', Margin Value=' + quotePartsMapLowestMarginPercent.get(Quote.Id)[0].CurrencyISOCode + ' ' + marginValueFormat +
', Margin %=' + String.valueOf(quotePartsMapLowestMarginPercent.get(Quote.Id)[0].Margin_Percent__c);
//Assign to Field
Quote.Quote_Part_Lowest_Lowest_Margin__c = lowestMarginPercent;
}
if(quotePartsMapHighestMarginValue.get(Quote.Id) != null && quotePartsMapHighestMarginValue.get(Quote.Id).size() > 0)
{
Integer index = quotePartsMapHighestMarginValue.get(Quote.Id).size() - 1;
String marginValueFormat = quotePartsMapHighestMarginValue.get(Quote.Id)[index].Margin_Net_Dollars__c.format();
system.debug('Highest Value marginNetDollars is '+quotePartsMapHighestMarginValue.get(Quote.Id)[index].Margin_Net_Dollars__c.format());
system.debug('Highest Value marginValueFormat is '+marginValueFormat);
if(marginValueFormat.contains('.'))
{
List<String> marginDecimals = marginValueFormat.split('\\.');
if(marginDecimals.size() == 2)
{
if(marginDecimals[1].length() == 1)
{
marginValueFormat = marginValueFormat + '0';
}
}
}
else
{
marginValueFormat = marginValueFormat + '.00';
}
String highestMarginValue = 'P/N ' + String.valueOf(quotePartsMapHighestMarginValue.get(Quote.Id)[index].Product_Code__c) +
', Margin Value=' + quotePartsMapHighestMarginValue.get(Quote.Id)[0].CurrencyISOCode + ' ' + marginValueFormat +
', Margin %=' + String.valueOf(quotePartsMapHighestMarginValue.get(Quote.Id)[index].Margin_Percent__c);
//Assign to Field
Quote.Quote_Part_Highest_Margin_Lowest_Marg__c = highestMarginValue;
}
}
}
}
}
===============================================================================
This is my test class
@isTest
public with sharing class QuoteManager_Test {
static testMethod void invokeTestMethod()
{
List<Account> alist = TestUtil.createTestAccounts(1, true);
List<Opportunity> olist = TestUtil.createTestOpportunities(1, true, alist.get(0));
Quote__c quote = new Quote__c(Opportunity_Name__c = olist.get(0).Id,Multiple__c = 100,Discount__c = 0,
Valid_Until__c = system.today().addDays(28),Sync_Required__c=true,Is_Portal_Quote__c=true,
HW_Approval_Stage__c='In Review',
Main_Quote__c=true,Type__c='Master',Status__c='Live');
List<Quote__c> quoteList = new List<Quote__c>();
quoteList.add(quote);
//QuoteManager.QuoteBeforeDelete(quoteList);
QuoteManager.populateMarginsFromQuoteParts(quoteList);
QuoteManager.QuoteBeforeDelete(quoteList);
//Opportunity[] testopps = TestUtil.createTestOpportunities(1, false, testaccts.get(0));
Opportunity[] testopps = TestUtil.createTestOpportunities(1, false, alist.get(0));
for (Opportunity to : testOpps)
{
to.PR_Admin__c = alist.get(0).Id;
to.OwnerId = UserInfo.getUserId();
to.End_User_Location_RCSM__c = alist.get(0).Id;
to.End_User_Location_RVP__c = alist.get(0).Id;
to.End_User_Account_Owner__c = alist.get(0).Id;
to.Partner_CBM__c = alist.get(0).Id;
to.Partner_CBM_Manager__c = alist.get(0).Id;
}
if(quoteList.get(0).HW_Approval_Stage__c == 'In Review'){
}
QuoteManager.updatePartnerCBMDetails(quoteList);
}
static testMethod void testupdatePartnerCBMDetails(){
}
}
==================================================================
Try adding asserts in test class to know where it is exactly failing.
One more thing, Add some system debugs and Check into debug logs while running the test classes, you will get some more idea of exact line number of error(Which variable is having null value).
The line which is stated does not give exact idea of error.
Hi Ajay,
Always remeber Attempt to de-reference a null object exception issue is generate only in 2 cases-
1) you can not initilized the variable OR object like -
Account Acc {get;set;} // this is decalartion
acc = new Account(); // this is initilization, you can check you code may be you doing this type of mistake.
acc=[SELECT id FROM Account LIMIT 1]; // this is assigning.
2) you can used a single instance of a object like above example, In this case if no records fetch It will show errror. It is much better you can used List of instance.
list<Account> accList = new list<Account>();
NOTE: please mark as solution for other user help in a same query.
Thank you,
Raj Jha