Início > Programação > Criação de Teste Unitário com Arquilian

Criação de Teste Unitário com Arquilian

O Arquillian é uma plataforma de testes funcionais e de integração que pode ser usada para validar a camada de negócio em Java. Toda a complexidade do container, implantação e inicialização ficam a cargo do Arquillian, o que libera o desenvolvedor para focar na escrita do teste unitário em si. Vamos aos passos da configuração para integrar o Arquillian com o JBoss.

1. O POM fica assim:

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.11</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.jboss.arquillian.container</groupId>
   <artifactId>arquillian-container-spi</artifactId>
   <version>1.1.5.Final</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.jboss.arquillian.junit</groupId>
   <artifactId>arquillian-junit-container</artifactId>
   <version>1.1.5.Final</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.glassfish.main.extras</groupId>
   <artifactId>glassfish-embedded-all</artifactId>
   <version>3.1.2.2</version>
   <scope>provided</scope>
</dependency>
<dependency>
   <groupId>org.jboss.arquillian.container</groupId>
   <artifactId>arquillian-glassfish-embedded-3.1</artifactId>
   <version>1.0.0.CR3</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>jaxen</groupId>
   <artifactId>jaxen</artifactId>
   <version>1.1.6</version>
</dependency>

2. É necessário criar um arquivo beans.xml no META-INF:

<?xml version="1.0" encoding="UTF-8"?>
   <beans xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/beans_1_1.xsd">
   </beans>

3. Por fim, é só criar uma classe base para ser extendida pelos testes unitários com a anotação @RunWith:

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public abstract class ServiceTest extends TestCase {
   private static JavaArchive javaArchive;
   @Deployment
   public static JavaArchive createArchiveAndDeploy() {
      if (javaArchive != null) {
         javaArchive = ShrinkWrap.create(JavaArchive.class)
           .addPackages(true, "br.com.teste")			                  
           .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
      }
      return javaArchive;
   }
}

Exemplo

Considere a classe persistente abaixo:

@Entity
@Table(name = "TBL_ATIVIDADE")
public class Atividade {
   @Id
   @GeneratedValue
   @Column(name = "PK_ATIVIDADE")
   private int id;
   @Column(name = "NM_NOME", length = 60);
   private String nome;

   // getters e setter omitidos
}

Essa entidade não tem nada especial. Vamos escrever uma classe de teste com um método para criar e persistir uma “Atividade” e realizar algumas verificações sobre ela:

public class AtividadeServiceTest extends ServiceTest {
   @EJB
   private AtividadeService service;
   @Test
   public void testCriar() throws Exception {
      Atividade atividade = new Atividade();
      atividade.setNome("Teste");
      service.criar(atividade);
      // Restante do teste. Pode-se, por exemplo, verificar
      // se a atividade foi mesmo persistida com o nome "Teste"
   }
}

Cuidados ao Utilizar JSON com Jackson

Se você manipula arquivos no formato JSON em disco utilizando a biblioteca de processamento Jackson, é necessária atenção à forma como o arquivo é interpretado pela biblioteca. Eu utilizava o código abaixo:

ObjectMapper mapper = new ObjectMapper();
File file = new File("teste.json");
List list = mapper.readValue(file, new TypeReference[List](){});

O problema estava no uso do TypeReference: quando esse código é acionado por uma tela – fora do contexto dos testes unitários – da minha aplicação rodando no JBoss, era retornada uma implementação da interface List, mas executando esse código no contexto dos testes unitários com o Arquillian, tentava-se fazer uma conversão para um LinkedHashMap! A solução é informar explicitamente qual é a implementação de tipo que se deseja utilizar:

ObjectMapper mapper = new ObjectMapper();
File file = new File("teste.json");
List list = mapper.readValue(file, TypeFactory.defaultInstance()
  .constructCollectionType(ArrayList.class, clazz));
Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: