ChatGPT解决这个技术问题 Extra ChatGPT

个 JUnit 断言类之间的差异

JUnit 框架包含 2 个 Assert 类(显然在不同的包中),每个类的方法看起来都非常相似。谁能解释这是为什么?

我指的类是:junit.framework.Assertorg.junit.Assert

在 Intellij IDEA 中,您可以从 Editor->General->Auto Import->Exclude from Import and Completion 的静态导入下拉列表中排除 junit.framework.*

S
Sae1962

(JUnit 3 的)旧方法是通过扩展 junit.framework.TestCase 来标记测试类。它继承了 junit.framework.Assert 本身,并且您的测试类获得了以这种方式调用断言方法的能力。

从 JUnit 版本 4 开始,框架使用 Annotations 来标记测试。因此您不再需要扩展 TestCase。但这意味着,断言方法不可用。但是您可以对新的 Assert 类进行静态导入。这就是为什么新类中的所有断言方法都是静态方法的原因。所以你可以这样导入它:

import static org.junit.Assert.*;

在此静态导入之后,您可以使用此方法而无需前缀。

在重新设计时,他们还移到了新的包 org.junit,它更好地遵循了包命名的正常约定。


这个答案并不完全正确,您可以对 junit.framework.Assert 和 org.junit.Assert 类中的方法进行静态导入。然而,坚持使用 org.junit.Assert 类可能是一个好主意,因为它更新,稍微重写并且可能意味着作为替代品。
V
Vic

JUnit 3.X:junit.framework.Assert

JUnit 4.X:org.junit.Assert

首选最新版本,尤其是在运行带有注释支持的 JDK5 及更高版本时。


D
David Moles

实际上有一个功能上的变化:如果您将两个参数 assertEquals()floatdouble 一起使用,org.junit.Assert 会报错,而 junit.framework.Assert 将自动装箱。


s
sblundy

我相信他们正在从 junit.framework 重构为 org.junit 并维护 junit.framework.Assert 以实现向后兼容性。


M
MatPag

在 Android Studio 中(在 IntelliJ 中也是如此),您可以从自动导入提案中全局排除 junit.framework

您可以在 IDEProject 之间设置范围。如果您没有使用 JUnit 3 的项目,您可以安全地使用 IDE 范围。

设置位置:

首选项 -> 编辑器 -> 常规 -> 自动导入

https://i.stack.imgur.com/MYacE.png


s
shyam

我做了一个粗略的源代码比较,没有严重的变化。 org.junit.Assert 中添加了大量注释,并进行了一些重构。唯一的变化是与 Arrays 的比较。有一些代码清理,但(恕我直言)没有功能更改


我相信@David Moles 是正确的,这将是一个功能上的改变。