首页 > 解决方案 > 如何在测试类中覆盖完成方法?

问题描述

我正在处理 Salesforce 批处理类,当批处理失败时应该向我发送电子邮件。目前,无论状态如何,它都会在批处理运行完成时发送电子邮件。

测试失败并断言电子邮件未按预期发送:

Error: System.AssertException: Assertion Failed: Email Not sent

主类:

public with sharing class BatchToUpdateIPiSeq extends ilib_ScheduleAndBatch implements Schedulable, Database.Stateful{
  public static final Integer IP_UP_GRACE_PERIOD = 90;
  public static final Integer IP_UP_GRACE_PERIOD  = 120;
  public static final string CODEPARAMETERNAME = 'Product_Code_for_IP';
  public Set<String> setNonUpdatedIPErrors = new Set<String>();
  @TestVisible static boolean boolEmailSent= false;
  public static Boolean boolIsTestRunning = false;


/*
*  Description: Execute method to be called when class is scheduled
*/
public override void execute(SchedulableContext ctx)
{
    integer intDefaultBatchsize = 1;
    Map < String, String > params = UtilsSettings.getCustomMetadataMap('Schedule_Batch_for_iSeq');
    Integer batchSize = UtilsSettings.parseIntegerFromSettingsMap(params, 'BatchiSeq', intDefaultBatchsize);
    
    if (batchSize < 1 || batchSize > 100) {
        batchSize = intDefaultBatchsize;
    }
    Database.executebatch(new BatchToUpdateIPiSeq(), batchSize);
    
}
/*
* Description: Fetch required installed products to process
*/
public override Database.QueryLocator start(Database.BatchableContext bc) {
    string strQuery;
    Date dtDueDate = Date.Today()-IP_UP_GRACE_PERIOD_ILMN;
    Set<String> productCode = new Set<String>();
    CodeParametersSelector codeParameterSlctr = new CodeParametersSelector();
    List<Code_Parameter__mdt> objCodeParam = codeParameterSlctr.selectCodeParameterByDeveloperName(new Set<String>{CODEPARAMETERNAME});
    productCode.addAll(objCodeParam[0].Value__c.split(';'));
    strQuery = 'SELECT Id, SVMXC__Company__c, Name, Operation_Status__c, SVMXC__Status__c, Acceptance_Date__c, SVMXC__Date_Installed__c, SVMXC__Date_Shipped__c FROM SVMXC__Installed_Product__c WHERE Product_Code__c IN:productCode AND SVMXC__Status__c = \'Shipped\' AND Operation_Status__c != \'On\' AND Acceptance_Date__c = NULL AND SVMXC__Date_Installed__c = NULL AND  SVMXC__Date_Shipped__c<:dtDueDate';
    return Database.getQueryLocator(strQuery);
}
/*
* Process the qualified records as batchs
*/
public void execute(Database.BatchableContext bc, List<SVMXC__Installed_Product__c> lstIP){
    set<Id>setAccId  = new set<Id>();
    for(SVMXC__Installed_Product__c objectIP : lstIP){
        setAccId.add(objectIP.SVMXC__Company__c);
    }
    List<ObjectTerritory2Association>listCPAccId = new ObjectTerritory2AssociationsSelector().selectIndirectByAccountIds(setAccId);
    map<id, ObjectTerritory2Association>mapIPobjTerritory = new map<id,ObjectTerritory2Association>();
    for(ObjectTerritory2Association ota : listCPAccId){
        mapIPobjTerritory.put(ota.ObjectId, ota);
    }
    for(SVMXC__Installed_Product__c objIP : lstIP){
        Date dtStartDate = objIP.SVMXC__Date_Shipped__c;
        Date dtDueDate = Date.Today();
        Integer numberDaysDue = dtStartDate.daysBetween(dtDueDate);
        
        if( mapIPobjTerritory.containsKey(objIP.SVMXC__Company__c)){
            if(numberDaysDue>IP_UP_GRACE_PERIOD_CP){
                objIP.Operation_Status__c = 'On';
                objIP.SVMXC__Status__c = 'Installed';
                objIP.Acceptance_Date__c = system.today();
                objIP.SVMXC__Date_Installed__c = system.today();
            }
        }else{
            objIP.Operation_Status__c = 'On';
            objIP.SVMXC__Status__c = 'Installed';
            objIP.Acceptance_Date__c = system.today();
            objIP.SVMXC__Date_Installed__c = system.today();
            
        }
    }
    
    if(!lstIP.isEmpty()){
        Database.SaveResult[] result = Database.update(lstIP, false);
        Integer intCount = 0;
        for (Database.SaveResult sr : result){
            if(!sr.isSuccess()){
                for(Database.Error err : sr.getErrors()){
                    setNonUpdatedIPErrors.add(lstIP.get(intCount).id +' : '+ err.getStatusCode() + ': ' + err.getMessage()+ ': ' + err.getFields());
                }
            }
            intCount++;
        }
    }
    
    
}
/*
* Finish Method
*/
public override void finish(Database.BatchableContext bc){
    if(!setNonUpdatedIPErrors.isEmpty() || !boolIsTestRunning){
        CodeParametersSelector codeParameterSlctr = new CodeParametersSelector();
        List<Code_Parameter__mdt> objCodeParam = codeParameterSlctr.selectCodeParameterByDeveloperName(new Set<String>{'SFDC_Service_Email_Id'});
        Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
        List<String> strEmailId = new List<String>();
        if(!Test.isRunningTest()){
            strEmailId.addAll(objCodeParam[0].Value__c.split(';'));
        }
        else{
            strEmailId.add('hshukla@illumina.com');
        }
            
        email.setToAddresses(strEmailId);
        String subject = 'ACTION NEEDED: Installed Product (iSeq/Dragen) update failed';
        email.setSubject(subject);
        String strBody = 'Following Installed Prodcut were not updated : </br>';
        for(String str : setNonUpdatedIPErrors){
            strBody = strBody + str+'</br>';
        }
        email.setHtmlBody(strBody);
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { email });
        boolEmailSent = true;
    }
}

测试类:

@isTest(SeeAllData=false)
public class TestBatchToUpdateIPiSeq {
public static final String NULL_Operation_STATUS = null;
public static final Date NULL_ACCEPTANCE_DATE = null;
public static final Date NULL_DATE_INSTALLED = null;
public static final String STRING_PRODUCT_CODE_iSEQ = '20021532';
public static final string CODEPARAMETERNAME = 'Product_Code_for_IP';
public static boolean updatedRecords;
static testmethod void testIPiSeq(){
    
   List<Territory2>listCPAccId = [SELECT Id FROM Territory2 WHERE Territory2Type.DeveloperName = 'Territory_Channel_Partner' AND Territory2Model.State = 'Active'];
    
    Account acc = TestDataAccount.getAccount('Test Acc', 'USD');
    acc.Account_Group__c='Distributor';
    insert acc;
    
    ObjectTerritory2Association objOTA = TestDataObjectTerritory2Association.getObjectAssociation(listCPAccId[0].Id,acc.Id);
    insert objOTA;
    List<String> productCode = new List<String>();
    CodeParametersSelector codeParameterSlctr = new CodeParametersSelector();
    List<Code_Parameter__mdt> objCodeParam = codeParameterSlctr.selectCodeParameterByDeveloperName(new Set<String>{CODEPARAMETERNAME});
    productCode.addAll(objCodeParam[0].Value__c.split(';'));
    Product2 objProduct = new Product2(Name = 'testProduct',Service_Product_Type__c = 'Core');
    objProduct.ProductCode = productCode[0];
    insert objProduct;
    
    SVMXC__Installed_Product__c objInstalledProduct = TestDataFieldService.createInstalledProduct('TestIP', 'USD', 'Shipped');
    SVMXC__Installed_Product__c objInstalledProduct1 = TestDataFieldService.createInstalledProduct('TestIP', 'USD', 'Shipped');
    objInstalledProduct.SVMXC__Company__c = acc.Id;
    objInstalledProduct1.SVMXC__Company__c = acc.Id;
    objInstalledProduct.SVMXC__Product__c=objProduct.id;
    objInstalledProduct1.SVMXC__Product__c=objProduct.id;
    objInstalledProduct.SVMXC__Date_Shipped__c = Date.newInstance(2020, 11, 01);
    objInstalledProduct1.SVMXC__Date_Shipped__c = Date.newInstance(2020, 11, 30);
    objInstalledProduct.Operation_Status__c = NULL_Operation_STATUS;
    objInstalledProduct1.Operation_Status__c = NULL_Operation_STATUS;
    objInstalledProduct.Acceptance_Date__c = NULL_ACCEPTANCE_DATE;
    objInstalledProduct1.Acceptance_Date__c = NULL_ACCEPTANCE_DATE;
    objInstalledProduct.SVMXC__Date_Installed__c = NULL_DATE_INSTALLED;
    objInstalledProduct1.SVMXC__Date_Installed__c = NULL_DATE_INSTALLED;
    insert new List<SVMXC__Installed_Product__c>{objInstalledProduct, objInstalledProduct1}; 
    BatchUpdateQSR.boolIsTestRunning = true;
    Test.StartTest();
    Database.executeBatch(new BatchToUpdateIPiSeq());  
    String sch = '0 0 0 * * ?';
    System.schedule('BatchToUpdateIPiSeq', sch, new BatchToUpdateIPiSeq()); 
    Test.StopTest();
    updatedRecords = true;
    
    List<SVMXC__Installed_Product__c> listIP = new List<SVMXC__Installed_Product__c>([Select Name, Operation_Status__c, SVMXC__Status__c from SVMXC__Installed_Product__c Where Id=:objInstalledProduct.id]);
    //system.assertEquals('On',listIP[0].Operation_Status__c);
    for(SVMXC__Installed_Product__c objIP : listIP){
        if(objIP.Operation_Status__c!='On'){
            updatedRecords = false;
        }
    }
    System.assert((BatchToUpdateIPiSeq.boolEmailSent),'Email Not sent');
    System.assertEquals(true,updatedRecords);
  }
}

标签: asynchronousapextest-class

解决方案


推荐阅读