Skip to main content

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.
Nota

Nota

Deseja aprender em português (Brasil)? Comece o desafio em um Trailhead Playground de português (Brasil) e copie e cole os valores de português (Brasil). Se você não passar no desafio em sua organização de português (Brasil), recomendamos que (1) mude o local para os Estados Unidos, (2) mude o idioma para inglês, seguindo as instruções aqui, e (3) clique novamente no botão “Validar o desafio”.

Consulte o emblema Trailhead no seu idioma para saber mais sobre como aproveitar a experiência de Trailhead em outros idiomas.

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.

  1. No Developer Console, clique em File (Arquivo) | New (Novo) | Apex Trigger (Acionador do Apex).
  2. Digite AccountDeletion para o nome do acionador e, em seguida, selecione Account (Conta) para o sObject. Clique em Submit (Enviar).
  3. 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.

  1. Em Setup (Configuração), pesquise Apex Triggers (Acionadores do Apex).
  2. Na página Apex Triggers (Acionadores do Apex), clique em Edit (Editar), próximo ao acionador AccountDeletion.
  3. Selecione Is Active (Está ativo).
  4. 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:

  1. Em Setup (Configuração), pesquise Apex Triggers (Acionadores do Apex).
  2. Na página Apex Triggers (Acionadores do Apex), clique em Edit (Editar) ao lado do acionador AddRelatedRecord.
  3. Desmarque a opção Is Active (Está ativo).
  4. 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.

  1. No Developer Console, clique em File (Arquivo) | New (Novo) | Apex Class (Classe do Apex).
  2. Insira TestAccountDeletion como nome da classe e, em seguida, clique em OK.
  3. Substitua o corpo de classe padrão pelo seguinte.
    @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());
      }
    }
    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 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 chamada Database.delete(). O valor de retorno é um objeto Database.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.
  4. Para executar esse teste, clique em Test (Teste) | New Run (Nova execução).
  5. Em Test Classes (Classes de teste), clique em TestAccountDeletion.
  6. Para adicionar todos os métodos na classe TestAccountDeletion para a execução de teste, clique em Add Selected (Adicionar selecionado).
  7. 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.

Nota

Um problema conhecido com o Developer Console o impede de atualizar a cobertura de código corretamente ao executar um subconjunto de testes. Para atualizar seus resultados de cobertura de código, utilize Test (Teste) | Run All (Executar todos) em vez de Test (Teste) | New Run (Nova execução).

Recursos

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');

    }

  }

}
Compartilhe seu feedback do Trailhead usando a Ajuda do Salesforce.

Queremos saber sobre sua experiência com o Trailhead. Agora você pode acessar o novo formulário de feedback, a qualquer momento, no site Ajuda do Salesforce.

Saiba mais Continue compartilhando feedback