java - 当 JMockit 位于类路径上时,Arquillian org.junit.runner.Runner NoClassDefFoundError

标签 java jboss-arquillian jmockit

我正在尝试对远程 Weblogic 12.1.x 进行非常简单的 Arquillian 测试,例如我有以下内容

public class MyBean {

}

然后是测试

@RunWith(Arquillian.class)
public class InjectionTest {

    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class, "lib.jar")
            .addClass(MyBean.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
     }

    @Inject
    MyBean bean;

    @Test
    public void test_bean_not_null() {
        Assert.assertNotNull(bean);
    }

}

足够简单!但是我得到以下堆栈跟踪

java.lang.NoClassDefFoundError: org.junit.runner.Runner
                at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:61)
                at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
                at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:36)
                at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
                at org.jboss.arquillian.junit.container.JUnitTestRunner.execute(JUnitTestRunner.java:66)
                at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.executeTest(ServletTestRunner.java:170)
                at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.execute(ServletTestRunner.java:135)
                at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.doGet(ServletTestRunner.java:98)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
                at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286)
                at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260)
                at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137)
                at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350)
                at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
                at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
                at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32)
                at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)
                at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3683)
                at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3649)
                at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)
                at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)
                at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
                at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)
                at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2433)
                at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2281)
                at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2259)
                at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1691)
                at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1651)
                at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:270)
                at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348)
                at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333)
                at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:54)
                at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)
                at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:640)
                at weblogic.work.ExecuteThread.execute(ExecuteThread.java:406)
                at weblogic.work.ExecuteThread.run(ExecuteThread.java:346)

这是我的 pom 的相关部分,我不确定它出了什么问题

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.arquillian</groupId>
            <artifactId>arquillian-bom</artifactId>
            <version>1.1.13.Final</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.jmockit</groupId>
        <artifactId>jmockit</artifactId>
        <version>1.18</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.extension</groupId>
        <artifactId>arquillian-persistence-dbunit</artifactId>
        <version>1.0.0.Alpha7</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.protocol</groupId>
        <artifactId>arquillian-protocol-servlet</artifactId>
        <version>1.1.11.Final</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.arquillian.container</groupId>
        <artifactId>arquillian-wls-remote-12.1.x</artifactId>
        <version>1.0.1.Final</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
    </dependency>
</dependencies>

编辑:如果我从依赖项列表中删除 JMockit,它就可以工作!不过,我确实需要 JMockit 进行单元测试。

最佳答案

好吧,显然测试依赖项的顺序很重要,我们在 JMockit 之前需要 arquillian junit 容器和 junit 本身

<dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
</dependency>
<dependency>
    <groupId>org.jmockit</groupId>
    <artifactId>jmockit</artifactId>
    <version>1.18</version>
    <scope>test</scope>
</dependency>

关于java - 当 JMockit 位于类路径上时,Arquillian org.junit.runner.Runner NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819764/

相关文章:

java - Helloworld JSF2.0 页面未呈现为 html 标签

java - 为什么 Maven 解析器会导致管理依赖项错误?

java - 是否可以使用 JMockit 来模拟局部变量?

java - 使用 Jmockit 模拟公共(public)方法

java - 模拟静态方法调用时发生意外调用

java - 将常量分配给对象

java - Java 中的 RuntimeException 扩展

java - 在 Java 中为挂起的进程中断线程

java - 使用 jpa 时实体不会被持久化

java - Arquillian EJB 添加mockito