【问题标题】:Unable to run Multiple tests with Arquillian无法使用 Arquillian 运行多个测试
【发布时间】:2014-12-17 09:53:24
【问题描述】:

我必须在我的应用程序中测试 Arquillian 单元,每个单元都有自己的部署方法:

@RunWith(Arquillian.class)
public class CallerTest {
    @EJB
    private CallerPrincipalDemoSessionBean sut;

    @Deployment
    public static WebArchive createTestArchive1() {
        WebArchive webArchive = ShrinkWrap.create(WebArchive.class, "test1.war")
                .addClasses(JBossLoginContextFactory.class, CallerPrincipalDemoSessionBean.class)
                .addAsWebInfResource("META-INF/ejb-jar.xml")
                .addAsWebInfResource("META-INF/jboss-ejb3.xml")
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
                .addAsResource("users.properties")
                .addAsResource("roles.properties");
        return webArchive;
    }

    ...

第二个:

@RunWith(Arquillian.class)
public class UsersTest {

    @ArquillianResource
    private URL serverUrl;

    @Deployment(testable = false)
    public static Archive createTestArchive2() {
        return ShrinkWrap.create(WebArchive.class, "test2.war")
                .addPackage(User.class.getPackage())
                .addPackage(UserFacade.class.getPackage())
                .addPackage(Users.class.getPackage())
                .addPackage(Credential.class.getPackage())
                .addAsResource("test-persistence.xml", "META-INF/persistence.xml")
                .setWebXML(new File("src/test/resources/test-web.xml"))
                .addAsWebInfResource("META-INF/jboss-web.xml")
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
                .addAsResource("users.properties")
                .addAsResource("roles.properties");
    }

    ...

当我删除其中一个类或评论“@Deployment”方法之一时,mvn test 完美。但是使用 2 "@Deployment" 方法,即使使用 mvn test -Dtest=com.wpic.tmall.rest.UsersTest 测试单个类也会引发异常:

ERROR [org.jboss.msc.service.fail] MSC000001: Failed to start service jboss.deployment.unit."test2.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."test2.war".WeldStartService: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_05]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_05]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_05]
Caused by: org.jboss.weld.exceptions.DeploymentException: org/jboss/shrinkwrap/api/asset/Asset
    at org.jboss.weld.executor.AbstractExecutorServices.checkForExceptions(AbstractExecutorServices.java:66)
    at org.jboss.weld.executor.AbstractExecutorServices.invokeAllAndCheckForExceptions(AbstractExecutorServices.java:43)
    at org.jboss.weld.executor.AbstractExecutorServices.invokeAllAndCheckForExceptions(AbstractExecutorServices.java:51)
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer.createClassBeans(ConcurrentBeanDeployer.java:72)
    at org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:260)
    at org.jboss.weld.bootstrap.WeldStartup.deployBeans(WeldStartup.java:351)
    at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:79)
    at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:92)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    ... 3 more
Caused by: java.lang.NoClassDefFoundError: org/jboss/shrinkwrap/api/asset/Asset
    at java.lang.Class.getDeclaredMethods0(Native Method) [rt.jar:1.8.0_05]
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2688) [rt.jar:1.8.0_05]
    at java.lang.Class.getDeclaredMethods(Class.java:1962) [rt.jar:1.8.0_05]
    at java.lang.Class.getEnclosingMethod(Class.java:1032) [rt.jar:1.8.0_05]
    at org.jboss.weld.util.reflection.Reflections.isNonStaticInnerClass(Reflections.java:388)
    at org.jboss.weld.util.Beans.isTypeManagedBeanOrDecoratorOrInterceptor(Beans.java:486)
    at org.jboss.weld.bootstrap.BeanDeployer.createClassBean(BeanDeployer.java:233)
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:74)
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:72)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_05]
    ... 3 more
Caused by: java.lang.ClassNotFoundException: org.jboss.shrinkwrap.api.asset.Asset from [Module "deployment.test2.war:main" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:213) [jboss-modules-1.3.3.Final.jar:1.3.3.Final]
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459) [jboss-modules-1.3.3.Final.jar:1.3.3.Final]
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:408) [jboss-modules-1.3.3.Final.jar:1.3.3.Final]
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389) [jboss-modules-1.3.3.Final.jar:1.3.3.Final]
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134) [jboss-modules-1.3.3.Final.jar:1.3.3.Final]
    ... 15 more

我将wildfly-arquillian-container-embedded 版本8.1.0.Final 用于容器。

【问题讨论】:

    标签: java maven jakarta-ee wildfly jboss-arquillian


    【解决方案1】:

    没有任何解决方案,但有一些小建议:

    • 最好的办法是在查看 Arquillian 时暂时忽略 IDE。所以首先:确保您使用 maven(而不是 IDE)启动测试
    • 小心嵌入式容器。如果我是你,我会切换到 remotemanaged 容器,因为它们更可靠。而且前者不会产生任何启动开销(当然,一旦启动)
    • 您知道@Deployment(testable = false)(testable = true) 之间的区别吗?
    • 确保您在部署档案中没有遗漏任何需要的类。为了实现这一点,我喜欢通过.addPackages(true, "com.company.your_module") 进行递归加法
    • 如果没有任何帮助,您可以尝试不同的远程容器,例如:JBoss AS 7.1.1、Wildfly 8.0.0

    ps。 this question 看起来和你的很像。

    希望对你有所帮助

    【讨论】:

    • 谢谢,但我使用的是 maven 而不是 IDE,我使用的是嵌入式容器,因为可以使用诸如“travis-ci.org”之类的 CI 工具运行测试(我还有一些其他远程用于快速测试的配置文件)。
    • 另外,我已经测试过了,Arquillian 测试真的很慢,因为部署很慢。托管测试需要 17 秒,远程测试需要 16 秒,因此我无需设置 wildfly 并进行配置只需 1 秒。
    • @user1079877 但您的测量是否还包括启动时间?如果是,不要计算这个因素,因为远程它是每个测试一次。但是时间在这里并不是最重要的——我推荐你remote/managed container,因为它的可靠性和稳定性。
    猜你喜欢
    • 2011-11-12
    • 2015-03-17
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    相关资源
    最近更新 更多