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!!!!