问题描述
我正在处理 Salesforce Batch 类,当批处理失败时,它会向我发送电子邮件。目前,无论状态如何,它都会在批处理运行完成时发送电子邮件。
测试失败,断言电子邮件未按预期发送:
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','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,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,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);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)