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