sexta-feira, 9 de novembro de 2018

Testando métodos com anotação @future no Salesforce

Ao chamar um método com a anotação @future uma nova thread é criada e enfileirada para ser executada de forma assíncrona à chamada original. Dessa forma, não há qualquer garantia que o conteúdo do método futuro será executado antes ou depois do contexto que o chamou. 

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: