我试图通过定义一个抽象类来执行测试,这将使用Arquillian和ShrinkWrap为每个测试创建一个公共部署。在我的存储库中,我有一个EntityManager,它执行JPA操作。 UserRepository和CarRepository是相同的(User和Car除外)。对于UserRepositoryTest和CarRepositoryTest也是如此。
但是,CarRepositoryTest会因某种原因生成错误。你能帮我么? =)
public abstract class AbstractRepositoryTest {
@Inject
protected UserRepository userRepository;
@Inject
protected GroupRepository groupRepository;
@Inject
protected CarRepository carRepository;
protected DummyGenerator dg;
protected UserRepositoryFindQuery qUser;
protected CarRepositoryFindQuery qCar;
@Deployment
public static final Archive<?> createDeployment() {
File[] libs = Maven
.resolver()
.loadPomFromFile("pom.xml")
.resolve("org.apache.commons:commons-lang3",
"org.fluttercode.datafactory:datafactory",
"org.dbunit:dbunit",
"mysql:mysql-connector-java",
"org.slf4j:slf4j-api",
"org.slf4j:slf4j-jdk14")
.withTransitivity().asFile();
return ShrinkWrap
.create(WebArchive.class, "test.war")
.addAsLibraries(libs)
.addPackage(User.class.getPackage())
.addPackage(UserRepository.class.getPackage())
.addPackage(DummyGenerator.class.getPackage())
.addAsResource("test-persistence.xml",
"META-INF/persistence.xml")
.addAsResource("database-test-setup.xml", "database-test-setup.xml")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Before
public void setUp() throws Exception {
resetDatabase();
dg = new DummyGenerator();
qUser = new UserRepositoryFindQuery();
qCar = new CarRepositoryFindQuery();
}
// ..
}
@RunWith(Arquillian.class)
public class CarRepositoryTest extends AbstractRepositoryTest {
@Test
public void testIsDeployed() {
Assert.assertNotNull(carRepository);
}
@Test
public void testCreateNewCar() throws Exception {
Car car = dg.getCar();
User user = dg.getUser();
car.modifyUser(user);
// Execute
Car createdCar = carRepository.create(car);
assertNotNull(createdCar);
// Verify
qCar.addToRegistrationNumberCriteria(dg.getLastCars().get(0).getRegistrationNumber());
carRepository.find(qCar);
assertEquals(1, qCar.getResult().size());
assertEquals(dg.getLastCars().get(0), qCar.getResult().get(0) );
}
// ..
}
@RunWith(Arquillian.class)
public class UserRepositoryTest extends AbstractRepositoryTest {
@Test
public void testIsDeployed() {
Assert.assertNotNull(userRepository);
}
@Test
public void createUser() {
User user = dg.getUser();
User createdUser = userRepository.create(user);
qUser.setUserIdCriteria(dg.getLastUsers().get(0).getUserId());
userRepository.find(qUser);
assertEquals(1, qUser.getResult().size());
assertEquals(qUser.getResult().get(0), createdUser);
}
// ..
}
@Stateless
@LocalBean
//@RolesAllowed({ "RegisteredUsers" })
//@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class CarRepository implements GenericRepository<Car, Long> {
@PersistenceContext
private EntityManager em;
public CarRepository() {
}
@Override
public Car create(Car car) {
em.persist(car);
return car;
}
@Override
public Car modify(Car car) {
Car mergedCar = em.merge(car);
return mergedCar;
}
// ..
}
@Stateless
@LocalBean
public class UserRepository implements GenericRepository<User, String> {
@PersistenceContext
private EntityManager em;
public UserRepository() {
}
@Override
public User create(User user) {
em.persist(user);
return user;
}
@Override
public User modify(User user) {
// em.find(User.class, user.getUserId());
User mergedUser = em.merge(user);
return mergedUser;
}
// ..
}
//错误日志:
testCreateNewCar(se.while_se.service.jpa.CarRepositoryTest) Time elapsed: 0.976 sec <<< ERROR!
javax.ejb.EJBException: Transaction aborted
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:304)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:702)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1490)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3143)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:346)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157)
at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:855)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5136)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
at com.sun.proxy.$Proxy2124.create(Unknown Source)
at se.while_se.service.jpa.__EJB31_Generated__CarRepository__Intf____Bean__.create(Unknown Source)
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)
at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:264)
at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:260)
at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:111)
at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56)
at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:105)
at se.while_se.service.jpa.CarRepository$Proxy$_$$_Weld$Proxy$.create(CarRepository$Proxy$_$$_Weld$Proxy$.java)
at se.while_se.service.jpa.CarRepositoryTest.testCreateNewCar(CarRepositoryTest.java:38)
Results :
Tests in error:
CarRepositoryTest.testCreateNewCar:38 » EJB Transaction aborted
Tests run: 7, Failures: 0, Errors: 1, Skipped: 0