Maven构建正在运行,但junit正在抛出NoSuchMethodError

时间:2015-09-21 18:06:32

标签: java eclipse maven junit

刚刚将PowerMock添加到我的项目pom文件中,这样我就可以开始模拟一些静态方法了。我已经验证所有版本都是最新的,包括Juint,Javassit和mockito。导致此问题的一行是:

@RunWith(PowerMockRunner.class)

当该行被注释掉时,我的代码在Junit中运行良好,Junit有心脏病发作,但是maven构建完美无缺。现在我可以习惯使用maven构建,但我希望能够通过Junit调试我的测试。

我尝试了以下方法:使用终端和Eclipse的UI中的maven安装/清理/构建来清理eclipse,疯狂地按下F5,同时在黑暗的角落里摇晃2小时。对此问题的任何帮助将不胜感激。

当我尝试作为junit测试运行时,下面是失败跟踪。

java.lang.NoSuchMethodError: javassist.CtMethod.hasAnnotation(Ljava/lang/Class;)Z
at org.powermock.core.transformers.impl.TestClassTransformer.removeTestAnnotationsForTestMethodsThatRunOnOtherClassLoader(TestClassTransformer.java:185)
at org.powermock.core.transformers.impl.TestClassTransformer.transform(TestClassTransformer.java:198)
at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:251)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:68)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:145)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:61)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)


            <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.10.19</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock</artifactId>
            <version>1.6.2</version>
            <scope>test</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-core</artifactId>
            <version>1.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>1.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>1.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.4.GA</version>
            <scope>test</scope>
        </dependency>

3 个答案:

答案 0 :(得分:2)

您提供的信息不足以找出可能存在的问题。我建议你运行

mvn dependency:tree

它将列出项目中的所有依赖项。尝试使用不同的版本查找simillar依赖项。

另一个可能的解决方案:您是否在类路径中拥有正确的Javassist版本(3.18.2)?

答案 1 :(得分:1)

所以我使用Raptor(我相信这是Eclipse的内部版本)会强制某些依赖版本安装(即使没有pom)。虽然我的pom文件中只有正确的版本,但Raptor正在手动安装不兼容的版本,这是优先考虑的。 (至少那是我认为发生的事情)

我必须使用依赖管理器在我的父pom中进行一些强有力的版本控制,我似乎已经解决了这个问题。虽然随着图书馆没有正确的方法而出现了一些问题。我最终通过找到一起工作的依赖项版本(由公司存储库管理器允许)来解决这些问题(很多修改并看到哪些版本会很好用)。由于存储库管理器,我无法下载我需要的每个依赖项的最新版本。

如果您遇到此问题,请确保您的版本兼容,如果您可以获得最新版本的依赖项。如果没有,请抓住啤酒,然后从您的存储库管理器提供的最新版本开始,并开始尝试查找彼此协同工作的版本。

答案 2 :(得分:0)

我找到了修复程序。我不得不添加

<dependency>
            <groupId>com.ebay.raptor.core</groupId>
            <artifactId>RaptorKernel</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>javassist</artifactId>
                    <groupId>javassist</groupId>
                </exclusion>
            </exclusions>
        </dependency>

RaptorKernel可以被任何引入javassist不同(3.18.2除外)依赖的工件所取代。