코드를 사용하여 현재의 방식으로 배치를 쉽게 테스트 할 수 없습니다. 이는 테스트 데이터를 만들 때 오늘 날짜로 생성되므로 쿼리 로케이터가 레코드를 반환하지 않고 실행 메서드가 실행되지 않기 때문입니다.
배치를 조정하여 작동 가능하도록했습니다.
global class CaseEscalation implements Database.Batchable<SObject> {
private static Date cutOff;
global CaseEscalation(Date CutOffDate){
cutOff = CutOffDate;
}
global Database.QueryLocator start(Database.BatchableContext ctx){
return Database.getQueryLocator('SELECT Id, CaseNumber, CreatedDate, Status FROM Case WHERE (Status != \'Closed\' AND Status != \'Escalated\') and CreatedDate < :cutOff ');
}
global void execute(Database.BatchableContext ctx, List<Sobject> scope){
if(scope.size() == 0)
return;
for(Case c : (List<Case>)scope){
String emailMessage = 'The case ' + c.CaseNumber + ' has been ecalated ' + ' Please look into the case ' + 'Thankyou';
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {'[email protected]'};
mail.setToAddresses(toAddresses);
mail.setSubject('Case Escalation');
mail.setPlainTextBody(emailMessage);
Messaging.sendEmail(new Messaging.SingleEmailMessage[]{ mail });
c.Status = 'Escalated';
}
update scope;
}
global void finish(Database.BatchableContext ctx){
}
}
일단 이것을 사용하면 테스트가 실행되었음을 증명할 수 있습니다. 배치 실행 메서드 내에서 한 번에 10 개 이상의 전자 메일을 보낼 수 없으므로 배치를 실행할 때 scope 매개 변수를 execute 메서드에 전달해야합니다. 간단히 말해서 execute 메소드의 루프 내에서 전자 메일의 본문을 작성한 다음 업데이트 된 레코드의 세부 정보가 모두 포함 된 전자 메일 하나 (전자 메일 하나, 훨씬 더 깨끗한받은 편지함 및 없음)를 보내는 것이 좋습니다. 주지사 한도에 대한 우려. 나는 당신의 원래 코드에 최대한 가깝게하고 싶었 기 때문에 이것을하지 않았다.
그러면 코드를 실행하기 위해 다음과 같은 테스트 스크립트를 작성할 수 있습니다. 테스트에주의 할
@isTest
private class CaseEscalationTest {
private static testMethod void testInCutOff(){
List<Case> testCases = new List<Case>();
for(Integer i = 0; i < 10; i++)
testCases.add(new Case(Status='Open'));
insert testCases;
Test.startTest();
CaseEscalation ce = new CaseEscalation(system.today().addDays(1));
database.executeBatch(ce, 10);
Test.stopTest();
testCases = [SELECT Id FROM Case WHERE Status = 'Open'];
system.assertEquals(0, testCases.size());
}
private static testMethod void testOUtOfCutOff(){
List<Case> testCases = new List<Case>();
for(Integer i = 0; i < 10; i++)
testCases.add(new Case(Status='Open'));
insert testCases;
Test.startTest();
CaseEscalation ce = new CaseEscalation(system.today());
database.executeBatch(ce, 10);
Test.stopTest();
testCases = [SELECT Id FROM Case WHERE Status = 'Open'];
system.assertEquals(10, testCases.size());
}
}
상황이 Test.startTest()
및 Test.stopTest()
이 때문에 시험을 계속 당신에게 데이터베이스에서 업데이트 된 데이터를 선택하고 수 있습니다 보장 할 수있는 기회를주기 전에 실행하는 배치를 강제로 사용됩니다 당신이 예상했던대로 바뀌 었습니다. 앞서 말했듯이 'database.executeBatch()`메서드는 두 번째 매개 변수를 전달하여 범위의 레코드 수를 제한해야하므로 execute 메서드의 구조를 변경하여이 메서드를 제거 할 수 있습니다. 한 가지 유의할 점은 배치를 테스트하기 위해 하나 이상의 레코드를 작성하는 것이 좋지만 하나의 테스트에서 호출되는 하나의 execute 메소드 만 가질 수 있으므로 하나 이상의 "범위 (scope)"가치를 생성하지 않는 것을 기억하십시오.