Testes de EJB & JPA com o Arquillian & TestNG / Wildfly
-
21-12-2019 - |
Pergunta
Eu estou lutando com a execução de uma forma bastante simples de caso de teste usando o Arquillian - Ele usa um EJB de classe, a fim de inserir uma entidade (Usuário) para o DB usando JPA (Hibernate), mas uma exceção é lançada.Eu estou usando o TestNG como o framework de testes.
Estrutura de pasta
MyProject
ear
domain - all jpa entities
ejb - holds NewUser ejb
war - currently empty
Teste
public class NewUserTest extends Arquillian
{
@EJB
private NewUser newUser;
@Deployment
public static JavaArchive createDeployment()
{
JavaArchive arc = ShrinkWrap
.create(JavaArchive.class)
.addClasses(User.class, Gender.class, PersonalData.class,
NewUser.class, NewUserTest.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
.addAsResource("META-INF/test-persistence.xml",
"META-INF/persistence.xml");
return arc;
}
@Test
public void checkDBInsert()
{
newUser.registerUser();
}
}
EJB
@Stateless
public class NewUser
{
@PersistenceContext(name = "testPU")
EntityManager em;
public void registerUser()
{
Calendar cal = Calendar.getInstance();
cal.set(1111, 2, 3);
User user = new User("Bugs", "Bunny", Gender.MALE, cal.getTime());
em.persist(user);
}
}
Entidade
@Entity
@TableGenerator(name = "UserIdGenerator", initialValue = 0, allocationSize = 1)
@NamedQueries({
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")})
public class User implements Serializable
{
private static final long serialVersionUID = -5675781058185805901L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "UserIdGenerator")
private Long id;
@Embedded
PersonalData personalData;
public User()
{
}
public User(String name, String familyName, Gender gender, Date birthdate)
{
this.init(name, familyName, gender, birthdate);
}
public Long getId()
{
return this.id;
}
public void setId(Long id)
{
this.id = id;
}
public PersonalData getPersonalData()
{
return this.personalData;
}
public void setPersonalData(PersonalData personalData)
{
this.personalData = personalData;
}
private void init(String name, String familyName, Gender gender,
Date birthdate)
{
PersonalData personalDataToAdd = new PersonalData(name, familyName,
gender, birthdate);
this.init(personalDataToAdd);
}
private void init(PersonalData personalData)
{
this.personalData = personalData;
}
@Override
public boolean equals(Object other)
{
boolean toReturn = false;
if (other instanceof User)
{
User castOther = (User) other;
toReturn = this.personalData.equals(castOther.getPersonalData());
}
return toReturn;
}
@Override
public String toString()
{
return "Id: " + this.id + "\n" + this.personalData;
}
}
test-persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.1"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="testPU" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<!-- Entities -->
<class>business.entities.PersonalData</class>
<class>business.entities.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<!-- general properties -->
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
</persistence>
A Exceção
FAILED: checkDBInsert
javax.ejb.EJBException: java.lang.IllegalArgumentException: Unknown entity: business.entities.User
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:190)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:340)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
<<<<<<<<<<<<<<<<rest of stack trace was deleted due to convenience issues>>>>>>>>>>>>>>>>>
Caused by: java.lang.IllegalArgumentException: Unknown entity: business.entities.User
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1184)
at org.jboss.as.jpa.container.AbstractEntityManager.persist(AbstractEntityManager.java:581)
at business.boundary.NewUser.registerUser(NewUser.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
<<<<<<<<<<<<<<<<rest of stack trace was deleted due to convenience issues>>>>>>>>>>>>>>>>>
Não importa o que eu gosto de ter outra exceção...
Solução
Aparentemente, eu tinha dois test-persistence.xml:Um no domínio dos recursos (o correto), e o outro no ejb recursos (ruim).Quando mudou-se do domínio de test-persistence.xml para ejb recursos do tudo funcionou.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow