Pruebas EJB y JPA con arquillón y testg / wildfly
-
21-12-2019 - |
Pregunta
Estoy luchando con la ejecución de un caso de prueba bastante simple usando Arquillian: utiliza una clase EJB en orden inserte una entidad (usuario) en la DB usando JPA (Hibernate), pero se lanzó una excepción.Estoy usando Testgn como el marco de prueba.
Estructura de carpeta
MyProject
ear
domain - all jpa entities
ejb - holds NewUser ejb
war - currently empty
prueba
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);
}
}
entidad
@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;
}
}
prueba-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>
La excepción
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>>>>>>>>>>>>>>>>>
No importa lo que cambie, obtengo otra excepción ...
Solución
Aparentemente, tuve dos pruebas-persistencia.xml: uno en los recursos del dominio (el correcto), y el otro en los recursos de EJB (uno malo).Cuando se mueve la prueba de dominio, la persistencia.xml a los recursos de EJB todo funcionó.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow