我有一个单元测试项目。我正在使用Maven和m2e。使用命令行中的Maven,我看到:
[INFO] | +- org.springframework:spring-test:jar:3.1.3.RELEASE:test
[INFO] | \- junit:junit-dep:jar:4.10:test
[INFO] +- org.mockito:mockito-core:jar:1.9.0:test
[INFO] | +- org.hamcrest:hamcrest-core:jar:1.2.1:test
[INFO] | \- org.objenesis:objenesis:jar:1.0:test
mvn install
有效,所有测试都在运行。好。
现在我尝试使用m2e 1.2.0从Eclipse中运行单元测试,我收到此错误:
java.lang.SecurityException: class "org.hamcrest.DiagnosingMatcher"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:806)
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:487)
...
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)
这让我很困惑。 m2e中的依赖树看起来很好。但是当我打开进程的属性时,我得到一个修改过的类路径,其中包含以下附加条目:
.../eclipse/3.7.2/eclipse/plugins/org.junit_4.8.2.v4_8_2_v20110321-1705/junit.jar
.../eclipse/plugins/org.hamcrest.core_1.1.0.v20090501071000.jar
由于这些JAR已签名,因此测试失败。我怎样才能摆脱这两个条目?或者我怎样才能确保它们在类路径的后期添加(即在我的JUnit + Hamcrest版本之后)?
答案 0 :(得分:4)
我找到了解决方法。
错误的原因是Eclipse的JUnit启动程序将JUnit和Hamcrest包添加到类路径中。这两个是签名的Orbit捆绑包,而Maven的JAR没有签名。
Hamcrest 1.2包含比Eclipse的Hamcrest 1.1更多的类。如果首先加载Hamcrest 1.1,Java将期望包org.hamcrest
中的所有类共享相同的加密签名。这不是真的,没有办法解决这个问题。
当我通过“Java Build Path”或启动配置的“Classpath”选项卡手动添加依赖项时,错误就消失了。
在这些地方,我可以确保来自.m2/repository/
的JAR首先出现在类路径中(在JDT JUnit运行器添加来自Eclipse的插件文件夹的JAR之前),因此Java将永远不会看到/尝试加载捆绑包来自Orbit。
在启动配置中,它看起来像这样:
但是我更喜欢Eclipse没有弄乱我的类路径: - (
答案 1 :(得分:0)
似乎有两种可能性:
你已经在类路径上获得了junit。在Project Properties-> Java Build Path,Libraries选项卡中,路径上是否有多个junit库,即您是否已将junit库添加到项目中。如果是这样,请将其删除并重试。
更可能的原因是你使用hamcrest 1.2。这与JUnit 4.10(或者4.8)不兼容。 JUnit 4.11之前包含了一些hamcrest 1.1类,因此您可能会遇到不兼容问题。你最好的选择是升级到4.11,它不包含hamcrest库,但是将hamcrest 1.3作为传递依赖。如果你可以使用hamcrest 1.3,那么,如果没有,1.2 应该工作。