Testar acionadores do Apex
Objetivos de aprendizagem
Após concluir esta unidade, você estará apto a:
- Escrever um teste para um acionador que dispara em uma operação de registro simples.
- Executar todos os métodos de teste de uma classe.
Testar acionadores do Apex
Antes de implantar um acionador, escreva testes de unidade que executem as ações que disparam o acionador e verifique os resultados previstos.
Vamos testar um acionador com o qual trabalhamos no módulo Acionadores do Apex. Se um registro de conta tiver oportunidades relacionadas, o acionador AccountDeletion
impede a exclusão do registro.
Pré-requisitos
Se você ainda não tiver adicionado o acionador AccountDeletion
, siga os passos abaixo.
- No Developer Console, clique em File (Arquivo) | New (Novo) | Apex Trigger (Acionador do Apex).
- Digite
AccountDeletion
para o nome do acionador e, em seguida, selecione Account (Conta) para o sObject. Clique em Submit (Enviar). - Substitua o código padrão pelo seguinte.
trigger AccountDeletion on Account (before delete) { // Prevent the deletion of accounts if they have related opportunities. for(Account a : [SELECT Id FROM Account WHERE Id IN (SELECT AccountId FROM Opportunity) AND Id IN :Trigger.old]) { Trigger.oldMap.get(a.Id).addError('Cannot delete account with related opportunities.'); } }
Se você tiver adicionado o acionador AccountDeletion
em uma unidade anterior, mas depois o tiver desativado para que o sistema pudesse verificar seu desafio, reative-o.
- Em Setup (Configuração), pesquise
Apex Triggers
(Acionadores do Apex). - Na página Apex Triggers (Acionadores do Apex), clique em Edit (Editar), próximo ao acionador
AccountDeletion
. - Selecione Is Active (Está ativo).
- Clique em Salvar.
Se sua organização contiver acionadores de uma unidade anterior, chamados AddRelatedRecord
, CalloutTrigger
ou HelloWorldTrigger
, desative-os. Por exemplo, para desativar o acionador AddRelatedRecord
:
- Em Setup (Configuração), pesquise
Apex Triggers
(Acionadores do Apex). - Na página Apex Triggers (Acionadores do Apex), clique em Edit (Editar) ao lado do acionador
AddRelatedRecord
. - Desmarque a opção Is Active (Está ativo).
- Clique em Salvar.
Para desativar os acionadores HelloWorldTrigger
e CalloutTrigger
, repita os passos acima.
Adicionar e executar um teste de unidade
Primeiramente, vamos começar adicionando um método de teste. Este método de teste verifica o que o acionador foi projetado para fazer (o caso positivo): impedir que uma conta seja excluída se ela possuir oportunidades relacionadas.
- No Developer Console, clique em File (Arquivo) | New (Novo) | Apex Class (Classe do Apex).
- Insira
TestAccountDeletion
como nome da classe e, em seguida, clique em OK. - Substitua o corpo de classe padrão pelo seguinte.O método de teste primeiro configura uma conta de teste com uma oportunidade. Em seguida, ele exclui a conta de teste, o que dispara o acionador
@isTest private class TestAccountDeletion { @isTest static void TestDeleteAccountWithOneOpportunity() { // Test data setup // Create an account with an opportunity, and then try to delete it Account acct = new Account(Name='Test Account'); insert acct; Opportunity opp = new Opportunity( Name=acct.Name + ' Opportunity', StageName='Prospecting', CloseDate=System.today().addMonths(1), AccountId=acct.Id); insert opp; // Perform test Test.startTest(); Database.DeleteResult result = Database.delete(acct, false); Test.stopTest(); // Verify // In this case the deletion should have been stopped by the trigger, // so verify that we got back an error. System.assert(!result.isSuccess()); System.assert(result.getErrors().size() > 0); System.assertEquals('Cannot delete account with related opportunities.', result.getErrors()[0].getMessage()); } }
AccountDeletion
. O método de teste verifica se o acionador impediu a exclusão da conta de teste por meio da verificação do valor de retorno da chamadaDatabase.delete()
. O valor de retorno é um objetoDatabase.DeleteResult
que contém informações sobre a operação de exclusão. O método de teste verifica se a exclusão não foi efetuada e também a mensagem de erro obtida. - Para executar esse teste, clique em Test (Teste) | New Run (Nova execução).
- Em Test Classes (Classes de teste), clique em TestAccountDeletion.
- Para adicionar todos os métodos na classe
TestAccountDeletion
para a execução de teste, clique em Add Selected (Adicionar selecionado). - Clique em Run (Executar). Encontre o resultado do teste na guia Tests (Testes), na última execução de teste.
A classe de teste TestAccountDeletion
contém apenas um método de teste, que testa um único registro de conta. Além disso, esse teste é para o caso positivo. Teste sempre mais cenários para se certificar de que o acionador funciona em todos os casos, incluindo a exclusão de uma conta sem oportunidades e exclusões de conta em massa.
Os dados de teste são configurados dentro do método de teste, o que pode se tornar demorado, à medida que você adiciona mais métodos de teste. Se você tiver muitos métodos de teste, ponha a criação de dados de teste em uma classe de utilitário de teste e chame a classe de utilitário a partir de múltiplos métodos de teste. A próxima unidade mostra como tirar vantagem de uma classe de utilitário de teste e adicionar mais métodos de teste.
Quero saber mais
O método de teste contém o par de métodos Test.startTest()
e Test.stopTest()
, que delimita um bloco de código para obter um conjunto novo de limites do administrador. Neste teste, a configuração de dados de teste usa duas instruções DML antes da execução do teste. Para testar se o código do Apex é executado dentro dos limites do administrador, isole a utilização do limite de configuração de dados daquela de seu teste. Para isolar a utilização do limite do processo de configuração de dados, coloque a chamada de teste dentro do bloco Test.startTest()
e Test.stopTest()
. Use esse bloco de teste também ao testar o Apex assíncrono. Para obter mais informações, consulte Como usar limites, startTest e stopTest.
Recursos
- Guia do desenvolvedor do Apex: Understanding Testing in Apex
- Guia do desenvolvedor do Apex: Acionadores
Preparar-se para o desafio prático
Para completar o desafio prático desta unidade, você precisará criar um novo acionador do Apex no objeto Contato chamado RestrictContactByName
com o código abaixo:
trigger RestrictContactByName on Contact (before insert, before update) { //check contacts prior to insert or update for invalid data for(Contact c : Trigger.New) { if(c.LastName == 'INVALIDNAME') { //invalidname is invalid c.AddError('The Last Name "'+c.LastName+'" is not allowed for DML'); } } }