You need to sign in to do that
Don't have an account?
Chandu007
getting System.DmlException: Insert failed. in test class for trigger. how to resolve this?
Getting System.DMLException in test class for below trigger. Please help me to solve it.
Trigger:-
trigger OpportunityHowell on Opportunity (after Insert,after Update) {
List<Opportunity> listOpportunitiesToUpdate = new List<Opportunity>();
Set<Id> allOids = new Set<Id>();
for(Opportunity o: Trigger.new){
if(o.Multiplier__c != null && o.Multiplier__c != trigger.oldMap.get(o.id).Multiplier__c){
allOids.add(o.id);
}
}
listOpportunitiesToUpdate = [select id, (SELECT Id,Dollar_Sales_Howell__c from OpportunityLineItems) from Opportunity where id in :allOids];
for(Opportunity o:listOpportunitiesToUpdate){
o.Sum_of_Dollar_Sales_Howell__c = 0;
for(OpportunityLineItem oli: o.OpportunityLineItems)
Try{
o.Sum_of_Dollar_Sales_Howell__c += oli.Dollar_Sales_Howell__c;
}
Catch(Exception e)
{
}
if(listOpportunitiesToUpdate.size()>0)
update listOpportunitiesToUpdate;
}
}
Test class:-
@isTest
public class OpportunityHowellTest {
public static testMethod void TestOppty(){
Set<Id> allOids = new Set<Id>();
MHC2__Project__c p = new MHC2__Project__c(Name='Test Project',MHC2__MHC_Project_Bid_Date__c=System.Today(),MHC2__MHC_Target_Bid_Date__c=System.Today());
insert p;
Account a = new Account(Name='Test Account');
insert a;
Opportunity op = new Opportunity();
op.Name = 'My Test Opportunity';
op.Multiplier__c = 2;
op.Sum_of_Dollar_Sales_Howell__c = 0;
op.Bid_Date_Time__c = System.Now().addDays(30);
op.CloseDate = System.Now().addDays(45).date();
op.StageName = 'Bidding';
op.AccountId = a.Id;
op.Bid_Type__c = 'Lump Sum';
op.Project__c = p.Id;
insert op;
op.Multiplier__c = 5;
update op;
OpportunityLineItem oli = new OpportunityLineItem();
oli.Quantity = 1.0;
oli.OpportunityId = op.Id;
oli.Invoiced__c = false;
insert oli;
}
}
Error:-
System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, OpportunityHowell: execution of AfterInsert
caused by: System.NullPointerException: Attempt to de-reference a null object
Trigger.OpportunityHowell: line 6, column 1: []
Trigger:-
trigger OpportunityHowell on Opportunity (after Insert,after Update) {
List<Opportunity> listOpportunitiesToUpdate = new List<Opportunity>();
Set<Id> allOids = new Set<Id>();
for(Opportunity o: Trigger.new){
if(o.Multiplier__c != null && o.Multiplier__c != trigger.oldMap.get(o.id).Multiplier__c){
allOids.add(o.id);
}
}
listOpportunitiesToUpdate = [select id, (SELECT Id,Dollar_Sales_Howell__c from OpportunityLineItems) from Opportunity where id in :allOids];
for(Opportunity o:listOpportunitiesToUpdate){
o.Sum_of_Dollar_Sales_Howell__c = 0;
for(OpportunityLineItem oli: o.OpportunityLineItems)
Try{
o.Sum_of_Dollar_Sales_Howell__c += oli.Dollar_Sales_Howell__c;
}
Catch(Exception e)
{
}
if(listOpportunitiesToUpdate.size()>0)
update listOpportunitiesToUpdate;
}
}
Test class:-
@isTest
public class OpportunityHowellTest {
public static testMethod void TestOppty(){
Set<Id> allOids = new Set<Id>();
MHC2__Project__c p = new MHC2__Project__c(Name='Test Project',MHC2__MHC_Project_Bid_Date__c=System.Today(),MHC2__MHC_Target_Bid_Date__c=System.Today());
insert p;
Account a = new Account(Name='Test Account');
insert a;
Opportunity op = new Opportunity();
op.Name = 'My Test Opportunity';
op.Multiplier__c = 2;
op.Sum_of_Dollar_Sales_Howell__c = 0;
op.Bid_Date_Time__c = System.Now().addDays(30);
op.CloseDate = System.Now().addDays(45).date();
op.StageName = 'Bidding';
op.AccountId = a.Id;
op.Bid_Type__c = 'Lump Sum';
op.Project__c = p.Id;
insert op;
op.Multiplier__c = 5;
update op;
OpportunityLineItem oli = new OpportunityLineItem();
oli.Quantity = 1.0;
oli.OpportunityId = op.Id;
oli.Invoiced__c = false;
insert oli;
}
}
Error:-
System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, OpportunityHowell: execution of AfterInsert
caused by: System.NullPointerException: Attempt to de-reference a null object
Trigger.OpportunityHowell: line 6, column 1: []
If that is the case then remove the following line. The trigger code will always produce the error if there is a value in the Multiplier__c field on insert.
Regards,
Mkr
All Answers
Trigger.OldMap is null in after insert trigger. It can only be used in update triggers. You can try following instead with Trigger.isInsert:
Regards,
Mkr
Thanks for your suggestion. I have been asked to write test classes for triggers and i am not supposed to modify existing code in the triggers. thats the reason i have posted this in forum. Is there any other solution to cover the code coverage. Please confirm.
Thanks,
Chandra
Update Opportunity record after the insertion of OpportunityLineItem in your test class.
Let me know if it helps you.
Many Thanks,
Sunil Rathore
If that is the case then remove the following line. The trigger code will always produce the error if there is a value in the Multiplier__c field on insert.
Regards,
Mkr