No cenário de método assíncrono surge um "problema": Como criar um método de teste unitário para esse método? Bem, a solução é mais simples do que se imagina: Basta utilizar o Test.StartTest() e o Test.StopTest() e o método assíncrono entre eles.
A princípio mostro o método que desejo testar (coloquei uma método de espera ocupada só para comprovar a eficácia):
public class ClasseComMetodoFuturo {
@future
public static void metodoAssincrono(id idCaso){
ClasseComMetodoFuturo.sleep(5000);
Case caso = new Case(id = idCaso);
Caso.Origin = 'Web';
update caso;
}
private static void sleep(integer milliseconds){
Long timeDiff = 0;
DateTime firstTime = System.now();
do{
timeDiff = System.now().getTime() - firstTime.getTime();
}while(timeDiff <= milliseconds);
}
}
Agora minha classe de teste:
@isTest
public class ClasseComMetodoFuturoTest {
public static testmethod void testandoFuture(){
Case c = new Case();
insert c;
Test.startTest();
ClasseComMetodoFuturo.metodoAssincrono(c.id);
Test.stopTest();
c = [SELECT id, Origin FROM Case WHERE id = :c.id];
System.assertEquals('Web', c.Origin);
}
}
Faça um teste agora, removendo Test.StartTest() e o Test.StopTest(). O Resultado será:
System.AssertException: Assertion Failed: Expected: Web, Actual: null
Isso acontence pois, ao executar o Test.StopTest(), o Salesforce aguarda todas as execuções assíncronas que estão na fila de execução, pendentes para execução. Isto é, o StopTest faz com que seu método de teste aguarde do método @future, podendo assim esperar o resultado.
* Precisa de um suporte ou consultoria com seus códigos Apex na plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce.
Nenhum comentário:
Postar um comentário