0

我试图通过定义一个抽象类来执行测试,它将使用 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
4

0 回答 0