【问题标题】:Spring webapp doesn't start after adding tests with PowerMock使用 PowerMock 添加测试后,Spring webapp 无法启动
【发布时间】:2014-02-05 12:20:33
【问题描述】:

我需要带有 mockito api 的 powermock 来进行一些 JUnit 测试。测试运行良好,但现在我无法运行该项目。我不明白,因为所有新库都在测试范围内:

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.5.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.5.4</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
<!-- THIS IS NEEDED FOR JAVA 1.7 -->
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.18.1-GA</version>
        <scope>test</scope>
    </dependency>

当我在 Tomcat 上部署应用程序时,出现以下异常:

Caused by: java.lang.NoClassDefFoundError: javassist/bytecode/ClassFile
at org.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching(AbstractJarVisitor.java:246)
at org.hibernate.ejb.packaging.AbstractJarVisitor.executeJavaElementFilter(AbstractJarVisitor.java:212)
at org.hibernate.ejb.packaging.AbstractJarVisitor.addElement(AbstractJarVisitor.java:173)
at org.hibernate.ejb.packaging.ExplodedJarVisitor.getClassNamesInTree(ExplodedJarVisitor.java:126)
...
Caused by: java.lang.ClassNotFoundException: javassist.bytecode.ClassFile
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:154

我不明白为什么测试范围依赖性会干扰部署。

【问题讨论】:

    标签: java spring mockito powermock javassist


    【解决方案1】:

    你真的没有足够的关于你的 pom 的信息,但这看起来很可能:

    Javassist 是 Hibernate 的传递依赖项(请参阅 here),在您添加 powermock 之前,由于这种依赖关系,它已包含在您的 WAR 文件中。

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>XXXXX</version>
    </dependency>
    

    通过你的 powermock 诡计,你告诉 Maven javassist 不应该包含在你的 WAR 文件中,方法是明确地将其设置为测试范围:

    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.18.1-GA</version>
        <scope>test</scope>
    </dependency>
    

    因此,将 javassist 范围更改为 runtime,它将包含在您的 WAR 文件中,并且您的 ClassNotFoundException 应该消失。

    【讨论】:

    • 谢谢!这正是问题所在。
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 2013-09-26
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多