Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Teste de Integração

Olá!

Eu assisti o curso de testes Mock e SQL e daos, no entanto, o curso utiliza sessions.

Eu gostaria de testar a chamada de métodos de um bem utilizando inject e persistent context dos daos (cdi administrado pelo wildfly)

Exemplo, AutorBean.java

package com.project.bean;

import java.io.Serializable;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.transaction.Transactional;

import com.project.dao.AutorDao;
import com.project.model.Autor;

@SuppressWarnings("serial")
@Named
@RequestScoped
// javax.faces.view.ViewScoped
public class AutorBean implements Serializable {

    private Autor autor = new Autor();

    @Inject
    private AutorDao dao;// CDI faz new AutorDao() e injeta

    private Integer autorId;

    public Integer getAutorId() {
        return autorId;
    }

    public void setAutorId(Integer autorId) {
        this.autorId = autorId;
    }

    public void carregarAutorPelaId() {
        this.autor = this.dao.buscaPorId(autorId);
    }

    @Transactional
    public String gravar() {

        if (this.autor.getId() == null) {
            this.dao.adiciona(this.autor);
        } else {
            this.dao.atualiza(this.autor);
        }

        this.autor = new Autor();

        return "livro?faces-redirect=true";
    }

    @Transactional
    public void remover(Autor autor) {
        this.dao.remove(autor);
    }

    public List<Autor> getAutores() {
        return this.dao.listaTodos();
    }

    public Autor getAutor() {
        return autor;
    }

    public void setAutor(Autor autor) {
        this.autor = autor;
    }

    public Autor pegaAutorParaTesteArquillian() {
        System.out.println("got here: AutorBean.pegaAutorParaTesteArquillian()");
        return this.dao.buscaPorId(1);
    }

    public String stringTest() {
        return "hello";
    }
}

Eu gostaria de testar o método "pegaAutorParaTesteArquillian", para isso, eu precisso do AutorDao injetado e também o EntitnyManager

AutorDao.java

package com.project.dao;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.project.model.Autor;

@SuppressWarnings("serial")
@Stateless //EJB
public class AutorDao implements Serializable {

    @PersistenceContext
    EntityManager em;

    private DAO<Autor> dao;

    @PostConstruct
    void init() {
        this.dao = new DAO<Autor>(this.em, Autor.class);
    }

    public void adiciona(Autor t) {
        dao.adiciona(t);
    }

    public void remove(Autor t) {
        dao.remove(t);
    }

    public void atualiza(Autor t) {
        dao.atualiza(t);
    }

    public List<Autor> listaTodos() {
        return dao.listaTodos();
    }

    public Autor buscaPorId(Integer id) {
        System.out.println("buscaPorId");
        return dao.buscaPorId(id);
    }

}

Eu pesquisei na net e encontrei o Arquillian para realizar testes de integração. Eu criei uma classe de teste ArquillianTest.java

package com.project.test;

import javax.inject.Inject;

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.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

import com.project.bean.AutorBean;

@RunWith(Arquillian.class)
public class ArquillianTest {

//    @Deployment
//    public static JavaArchive creteDeployment(){
//        JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
//         .addPackage(Autor.class.getPackage()) // Add classes
//         .addPackage(AutorBean.class.getPackage()) // Add more classes
//         .addPackage(AutorDao.class.getPackage())
//         // FEST Assert is not part of Arquillian JUnit
//         .addPackages(true, "com.project")
//         // .addClasses(Person.class, PersonBean.class) is an alternative
//         // for addPackage
//         .addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml")) // b
//         .addAsResource("META-INF/persistence.xml");
//        return jar;
//    }

    @Deployment
    public static WebArchive createJavaTestArchive() {

        return ShrinkWrap.create(WebArchive.class)
                .addPackage("com.project.model")
                .addPackage("com.project.dao")
                .addPackage("com.project.bean")
                .addPackage("com.project.util")
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Inject
    AutorBean autorBean;

    @Test
    public void testString() {
        System.out.println("testSrting, autorBean.stringTest() = " + autorBean.stringTest());
        Assert.assertEquals("hello",autorBean.stringTest());
    }

    @Test
    public void test() {
        System.out.println("Name = " + autorBean.pegaAutorParaTesteArquillian().getNome());
        Assert.assertEquals("ola",autorBean.pegaAutorParaTesteArquillian().getNome());
    }

}

O teste "testString" funciona, isso indica que o AutorBean está sendo injetado, porem o teste "test" não carrega o objeto autorBean, o que me leva a crer que o AutorDao não está sendo injetado.

Outros arquivos:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.project</groupId>
  <artifactId>project-jsf-maven-tdd-wildfly</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <description>Basic Project with JSF, Maven, jUnit and Wildfly</description>

  <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.arquillian</groupId>
                <artifactId>arquillian-bom</artifactId>
                <version>1.1.11.Final</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>5.3</version>
        </dependency>

        <dependency>
            <groupId>org.primefaces.themes</groupId>
            <artifactId>all-themes</artifactId>
            <version>1.0.10</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.arquillian.junit/arquillian-junit-container -->
        <dependency>
            <groupId>org.jboss.arquillian.junit</groupId>
            <artifactId>arquillian-junit-container</artifactId>
            <version>1.1.11.Final</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jboss.arquillian.protocol/arquillian-protocol-servlet -->
        <dependency>
            <groupId>org.jboss.arquillian.protocol</groupId>
            <artifactId>arquillian-protocol-servlet</artifactId>
            <version>1.1.11.Final</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.jboss.arquillian.container</groupId>
            <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
            <version>1.0.0.CR9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-core</artifactId>
            <version>2.3.5.Final</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>prime-repo</id>
            <name>PrimeFaces Maven Repository</name>
            <url>http://repository.primefaces.org</url>
            <layout>default</layout>
        </repository>
    </repositories>

</project>

arquillian.xml

<arquillian xmlns="http://jboss.org/schema/arquillian"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://jboss.org/schema/arquillian
        http://jboss.org/schema/arquillian/arquillian_1_0.xsd">


    <container qualifier="jboss" default="true">
        <configuration>
            <property name="jbossHome">target/wildfly-10.1.0.Final</property>
            <property name="modulePath">target/wildfly-10.0.0.Final/modules</property>
        </configuration>
    </container>
    <extension qualifier="persistence">
        <property name="defaultDataSource">java:/basic-project-db</property>
    </extension>
</arquillian>

Alguém pode me dar uma mão???

Obs: seria ótimo ter um curso com teste de integração desse tipo como a que eu estou tentando!!!!

2 respostas

Olha.. vou ser sincero, o arquilian realmente é uma ferramenta meio chata.. quando tentei usar fiquei um pouco frustrado e deixei meio de lado :(. Vamos esperar se alguém manja o suficiente para ajudar, mas nesse momento tenho dessa dúvida boiar por um tempo...

solução!

Opa, tudo bem alberto?

Eu consegui resolver o problema e testar entitties, daos e beans.

Vamos lá!

1) Baixar o servidor wildfly-8.2.0.Final (a versao dá ainda não tem pacotes disponívies) e colocar na pasta target do seu projeto 2) Criar o arquivo arquilliam.xml em src/tests/resources e colar:

<?xml version="1.0" encoding="UTF-8"?>
  <arquillian xmlns="http://jboss.org/schema/arquillian"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://jboss.org/schema/arquillian
         http://jboss.org/schema/arquillian/arquillian_1_0.xsd">

        <container qualifier="jboss" default="true">
              <configuration>
                    <property name="jbossHome">target/wildfly-8.2.0.Final</property>
              </configuration>
        </container>
  </arquillian>

2) persistence.xml

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

        <persistence-unit name="basicProjectDb" transaction-type="JTA">

        <jta-data-source>java:/basic-project-db</jta-data-source>

        <class>com.project.model.Usuario</class>
        <class>com.project.model.Livro</class>
        <class>com.project.model.Autor</class>
        <class>com.project.model.Venda</class>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </properties>
    </persistence-unit>
</persistence>

Lembre-se de criar o seu datasource e configurar com o driver do seu banco

3) pom.xml

<build>
        <plugins>
              <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <!-- plugin Maven -->
                    <version>3.1</version>
                    <configuration>
                    <!-- Java -->
                          <source>1.8</source>
                          <target>1.8</target>
                    </configuration>
              </plugin>
        </plugins>
  </build> 

<dependencyManagement>
        <dependencies>
              <!-- Arquillian Jboss -->
              <dependency>
                    <groupId>org.jboss.arquillian</groupId>
                    <artifactId>arquillian-bom</artifactId>
                    <version>1.1.11.Final</version>
                    <type>pom</type>
                    <scope>import</scope>
              </dependency>
        </dependencies>
  </dependencyManagement>

<dependencies>

<!-- Outras dependencias de seu projeto -->


<!-- Arquillian JUnit Container -->
        <dependency>
              <groupId>org.jboss.arquillian.junit</groupId>
              <artifactId>arquillian-junit-container</artifactId>
              <scope>test</scope>
        </dependency>
              <!-- JUnit -->
        <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.11</version>
                <scope>test</scope>
        </dependency>

</dependencies>

<profiles>
       <!-- Perfil WildFly 8.2.0 do type managed -->
       <profile>
             <id>jboss</id>
             <dependencies>
                   <dependency>
                        <groupId>org.wildfly</groupId>
                        <artifactId>wildfly-arquillian-container-managed</artifactId>
                        <version>8.2.0.Final</version>
                        <scope>test</scope>
<!--                         Exclude unecessary calls Jconsole -->
                        <exclusions>
                              <exclusion>
                                    <groupId>sun.jdk</groupId>
                                    <artifactId>jconsole</artifactId>
                              </exclusion>
                        </exclusions>
                   </dependency>
                 </dependencies>
               </profile>
     </profiles>

4) AutorBeanTest.java

package com.project.bean;
import javax.inject.Inject;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.junit.InSequence;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

import com.project.bean.AutorBean;
import com.project.dao.AutorDao;
import com.project.dao.DAO;
import com.project.model.Autor;

@RunWith(Arquillian.class)
public class AutorBeanTest{
    @Deployment
    public static Archive<?> criarArquivoTeste() {
        Archive<?> arquivoTeste = ShrinkWrap.create(WebArchive.class, "myapp.war")
                .addClass(DAO.class).addClass(Autor.class).addClass(AutorDao.class).addClass(AutorBean.class)
                .addAsResource("META-INF/persistence.xml")
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
        return arquivoTeste;
    }


    @Inject
    AutorBean autorBean;

      @Inject
    AutorDao autorDao;

    @Test
    @InSequence(1)
    public void testString() {
        System.out.println("Nome Autor = " + autorDao.buscaPorId(1).getNome());
        Assert.assertEquals(autorDao.buscaPorId(1).getNome(),"Jose Helio de Brum Muller");
    }

    @Test
    public void test() {
        Assert.assertEquals(autorBean.pegaAutorParaTesteArquillian().getNome(), "Jose Helio de Brum Muller");
    }

}

Agora, importante!!!!

A ordem de chamada das classes importa, então para funcionar, deixe na seguinte ordem:

.addClass(DAO.class).addClass(Autor.class).addClass(AutorDao.class).addClass(AutorBean.class)

É isso!!!

Valew galera!!!