1

我有一个带有单元测试的项目。我正在使用 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 版本之后)?

4

2 回答 2

4

我找到了解决方法。

错误的原因是 Eclipse 的 JUnit 启动器将 JUnit 和 Hamcrest 包添加到类路径中。这两个是签名的 Orbit 包,而来自 Maven 的 JAR 没有签名。

Hamcrest 1.2 包含比 Eclipse 的 Hamcrest 1.1 更多的类。如果首先加载 Hamcrest 1.1,Java 将期望包中的所有类org.hamcrest共享相同的加密签名。这不是真的,也没有办法解决这个问题。

当我通过“Java 构建路径”或在启动配置的“类路径”选项卡中手动添加依赖项时,错误消失了。

在这些地方,我可以确保来自的 JAR.m2/repository/首先出现在类路径中(在 JDT JUnit 运行程序从 Eclipse 的插件文件夹中添加 JAR 之前),因此 Java 永远不会看到/尝试从 Orbit 加载包。

在启动配置中,它看起来像这样:

启动配置

但如果 Eclipse 没有弄乱我的类路径,我会更喜欢:-(

于 2013-01-08T08:14:39.103 回答
0

似乎有两种可能:

  1. 您已经在类路径中找到了 junit。在 Project Properties->Java Build Path 的 Libraries 选项卡中,路径上是否有多个 junit 库,即是否已将 junit 库添加到项目中。如果是这样,请将其删除并重试。

  2. 更可能的原因是您使用了 hamcrest 1.2。这与 JUnit 4.10(或 4.8)不兼容。JUnit pre-4.11 包含一些 hamcrest 1.1 类,因此您可能会遇到不兼容问题。您最好的选择是升级到 4.11,它不包括 hamcrest 库,但具有 hamcrest 1.3 作为传递依赖项。如果您可以使用 hamcrest 1.3,请执行此操作,否则,1.2应该可以工作。

于 2013-01-07T20:59:28.297 回答