在 Maven 中从 JDK 1.6 升级到 JDK 1.8 时 JUnit 失败,但它在 eclipse 中工作
Posted
技术标签:
【中文标题】在 Maven 中从 JDK 1.6 升级到 JDK 1.8 时 JUnit 失败,但它在 eclipse 中工作【英文标题】:JUnit are failing when upgraded from JDK 1.6 to JDK 1.8 in maven, but its works in eclipse 【发布时间】:2015-12-04 22:04:36 【问题描述】:我在我的项目中使用 JUnit 进行代码覆盖。对于 db,我使用 dbunit 就像模拟数据库一样。当我从 Eclipse UI 运行 JUnit 时,它通过了,但是在通过 maven 运行时它失败了。
以上设置在 JDK 1.6.25 中使用 maven 运行良好,但升级到 1.8.51 时开始失败。我已经更新了 maven 编译器插件,它不起作用。我用的是以下版本,junit - 4.7 2.dbunit - 2.4.8 hsqldb - 2.0.0 maven - 2.2.1。
【问题讨论】:
【参考方案1】: Issue:
-> 在 JAVA 1.6 中运行良好的所有测试用例在迁移到 JDK 1.8.51 时开始失败。 -> 因此,我们面临构建失败问题以及代码覆盖率降低。
Root Cause:
-> JUnit 使用 Java 反射从 Test 类中获取测试方法。在 JAVA 1.6 中返回的测试方法顺序与源文件中的声明相同。 -> 但是从 JAVA 7 开始,JVM 返回的方法顺序与源文件不同,会随机返回。 -> 由于我们的测试用例相互依赖,由于订单更改,它开始失败。 例如下面的测试用例使用相同的数据(Mock DB)执行, -> AddOperationTestCase() -> EditOperationTestCase() -> DeleteOperationTestCase() 如果由于 JVM 随机顺序而首先运行删除,则添加和编辑数据将不可用,它将失败。
Solution :
-> 我曾尝试在 JUnit 和 Sure Fire 插件中找到选项以保持与源文件相同的顺序,但在那里我找不到可行性。 -> 我已经确定了将在 JUnit 库中返回执行顺序的类,并相应地覆盖它以运行它的源文件顺序。 -> 到目前为止,我已经将此注释包装器添加到失败的类中,现在构建运行成功。
Wrapper 类的链接: https://somethingididnotknow.wordpress.com/2014/03/07/run-junit-tests-in-order/
【讨论】:
以上是关于在 Maven 中从 JDK 1.6 升级到 JDK 1.8 时 JUnit 失败,但它在 eclipse 中工作的主要内容,如果未能解决你的问题,请参考以下文章
eclipse的maven项目报Missing artifact jdk.toos:jdk.toos:jar:1.6错
maven解决Missing artifact jdk.tools:jdk.tools:jar:1.6
为啥 Maven 使用 JDK 1.6 但我的 java -version 是 1.7
使用 Eclipse / Maven 构建 Hadoop - 缺少工件 jdk.tools:jdk.tools:jar:1.6