You need to sign in to do that
Don't have an account?
Problem with test coverage
trigger NMO_CaseOppurtunity_PrimaryLogic_BIBU on Opportunity__c(before insert,beforeupdate){
list<Opportunity__c> lstCaseOpptyToUpdate = new list<Opportunity__c>();//lstCaseOpptyToUpdate is used to update CO that are not a part of trigger.
list<lead> lstLeadsToUpdate = new list<lead>();//lstLeadsToUpdate is used to update the lead owner whenever a primary CO changes.
set<Id> setLeadIds = new set<Id>();
map<Id,lead> mapLeads = new map<Id,lead>();
map<id,list<Opportunity__c>> mapLeadWiseCaseOpty = new map<id,list<Opportunity__c>>();
map<id,id> mapLeadAssignOwner = new map<id,id> ();
list<Opportunity__c> colst1=new list<Opportunity__c>() ;
for(Opportunity__c co:trigger.new){
setLeadIds.add(co.lead__c);// Gather all lead IDs related to the Case Oppurtunities.
}
for(Lead l : [select id,ownerId,(select id,OwnerId,Primary_Opportunity__c,Primary_Override__c from Case_Opportunities__r) from Lead where id in :setLeadIds]){
mapLeadWiseCaseOpty.put(l.id,l.Case_Opportunities__r);// map used to have all the related Case Oppurtunities for the lead IDs
mapLeads.put(l.id,l);
}
// When Record is inserted
if(trigger.isInsert){
for(Opportunity__c co:trigger.new){
colst1=mapLeadWiseCaseOpty.get(co.lead__C);// colst1 contains all the case oppurtunities related to the lead.
if(colst1.size()!=0){//check if it has any siblings
if(co.Primary_Override__c=='Yes'){// check if current case oppurtunity wants to become the primary CO.
for(integer i=0;i<colst1.size();i++){ //make all other CO in the system to false
colst1[i].Primary_Opportunity__c=false;
colst1[i].Primary_Override__c='No';
lstCaseOpptyToUpdate.add(colst1[i]);
}
co.Primary_Opportunity__c=true;
co.Primary_Override__c='No';
lead l = mapLeads.get(co.lead__c);
l.ownerId = co.ownerId;
lstLeadsToUpdate.add(l);
}
else{
co.Primary_Opportunity__c=false;
}
}
else{//No Siblings
co.Primary_Opportunity__c=true;
co.Primary_Override__c='No';
lead l = mapLeads.get(co.lead__c);
l.ownerId = co.ownerId;
lstLeadsToUpdate.add(l);
}
}
}
// when record is updated
if(trigger.isUpdate) {
set<id> cOids=new set<id>();
for(Opportunity__c coSet:trigger.new){
cOids.add(coSet.id);
}
for(Opportunity__c co:trigger.new){
colst1=mapLeadWiseCaseOpty.get(co.lead__C);// colst1 contains all the case oppurtunities related to the lead.
if(colst1.size()!=0){//it has siblings
if(co.Primary_Override__c=='Yes'){// check if current case oppurtunity wants to become the primary CO.
for(integer i=0;i<colst1.size();i++){ //make all other CO in the system to false
if((colst1[i].id!=co.id) && (!cOids.contains(colst1[i].id))){
colst1[i].Primary_Opportunity__c=false;
colst1[i].Primary_Override__c='No';
lstCaseOpptyToUpdate.add(colst1[i]);
}
}
co.Primary_Opportunity__c=true;
co.Primary_Override__c='No';
lead l = mapLeads.get(co.lead__c);
l.ownerId = co.ownerId;
lstLeadsToUpdate.add(l);
}
else{
if(co.Primary_Opportunity__c!=true){
co.Primary_Opportunity__c=false;
}
else{
lead l = mapLeads.get(co.lead__c);
l.ownerId = co.ownerId;
lstLeadsToUpdate.add(l);
}
}
}
else{//No Sibings
co.Primary_Opportunity__c=true;
co.Primary_Override__c='No';
lead l = mapLeads.get(co.lead__c);
l.ownerId = co.ownerId;
lstLeadsToUpdate.add(l);
}
}
}
//Final DML
if(lstCaseOpptyToUpdate.size()>0){
try{
update lstCaseOpptyToUpdate;
}
catch(System.DMLException e){
set<id> exleadIds=new set<id>();
for(Opportunity__c coError:lstCaseOpptyToUpdate){
exleadIds.add(coError.lead__c);
}
for(Opportunity__c coError1:trigger.new){
if(exleadIds.contains(coError1.lead__c)){
coError1.addError('The System encountered a problem when attempting to update related Case Oppurtunities:'+e.getMessage());
}
}
}
}
if(lstLeadsToUpdate.size()>0){
try{
update lstLeadsToUpdate;
}
catch(System.DMLException e){
set<id> exleadIds=new set<id>();
for(Lead luerror:lstLeadsToUpdate){
exleadIds.add(luerror.id);
}
for(Opportunity__c coError:trigger.new){
if(exleadIds.contains(coError.lead__c)){
coError.addError('The System encountered a problem when attempting to update lead owner:'+e.getMessage());
}
}
}
}
}
This is my code and i had written a test class for this which is covering only 76% of code and my org needs above 85%. The problem is i cannot cover the try catch methods in the code. could any one help me on how to write test class to throw an exception and enter the code in to exception....its urgent
To cover the catch blocks you have to create a scenerio that causes the exception..
For example
1. Create a good record
2. insert it - covers the good parts
3. create a record missing required fields
4. Insert it - covers dml exception
They do not have to be the same method. You can write one test method for the good case and another test method for the bad test case. The cumulative results of both methods will be applied....
my case is little bit different from that. I have two objects Obj A and ObjB.
Obj B is child
Obj A is master.
trigger is fired on obj B . when trigger is fired on obj B i am updating the records of ObjA and i am writing the update statement "update objAlistofRecords". this statement is written in try catch method.so i could not create records for obj A with some required values missing , if i create it i need to insert it in test class which will have the error there it self but not in the try catch.
If you are unable to create the scenerio in test methods then it is unlikly that it could happen in real life. Maybe you are trying to catch an error that will never exist?