用arquillian&testng / wildfly测试EJB&JPA
-
21-12-2019 - |
题
我正在努力使用arquillian运行相当简单的测试用例 - 它使用EJB类以命令使用JPA(Hibernate)将实体(用户)插入DB,但抛出异常。我正在使用testng作为测试框架。
文件夹结构
MyProject
ear
domain - all jpa entities
ejb - holds NewUser ejb
war - currently empty
.
测试
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);
}
}
.
实体
@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>
.
例外
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>>>>>>>>>>>>>>>>>
.
无论我更改,我都会得到另一个例外...
解决方案
显然我有两个测试持久性.xml:一个在域的资源中(正确的一个),另一个在EJB的资源中(一个糟糕的资源)。将域的Test-Persistency.xml转移到EJB的资源时,所有工作都已工作。
不隶属于 StackOverflow