有人知道为什么JUnit 4提供assertEquals(foo,bar)方法而不提供assertNotEqual(foo,bar)方法吗?

它提供了assertNotSame(对应于assertSame)和assertFalse(对应于assertTrue),所以它们没有包含assertnotqual似乎很奇怪。

顺便说一下,我知道JUnit-addons提供了我正在寻找的方法。我只是出于好奇才问的。


当前回答

我在java 8环境下的JUnit工作,使用jUnit4.12

对我来说:编译器无法找到方法assertNotEquals,即使当我使用 进口org.junit.Assert;

所以我改变assertNotEquals("addb",字符串);assertNotEquals(“addb”字符串);

因此,如果您面临关于assertNotEqual不被识别的问题,则将其更改为Assert.assertNotEquals(,);它应该能解决你的问题

其他回答

我建议你使用更新的assertThat()风格断言,它可以很容易地描述各种否定,并自动构建你所期望的描述以及如果断言失败你会得到什么:

assertThat(objectUnderTest, is(not(someOtherObject)));
assertThat(objectUnderTest, not(someOtherObject));
assertThat(objectUnderTest, not(equalTo(someOtherObject)));

这三个选项都是等效的,选择一个你觉得最易读的。

为了使用简单的方法名(并允许这种时态语法工作),你需要这些导入:

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

对于否定的断言,最好使用Hamcrest,而不是assertFalse,因为在前者中,测试报告将显示断言失败的差异。

如果使用assertFalse,只会在报告中得到一个断言失败。例如,丢失了关于失败原因的信息。

通常当我期望两个对象相等时,我这样做:

assertTrue(obj1.equals(obj2));

and:

assertFalse(obj1.equals(obj2));

当他们被认为是不平等的。我知道这不是对你问题的回答,但这是我能得到的最接近的答案。它可以帮助其他人搜索在JUnit 4.11之前的JUnit版本中可以做什么。

Modulo API一致性,JUnit不提供assertNotEquals()的原因与JUnit从未提供类似方法的原因相同

assertStringMatchesTheRegex(regex, str) vs. assertStringDoesntMatchTheRegex(regex, str) assertStringBeginsWith(prefix, str) vs. assertStringDoesntBeginWith(prefix, str)

也就是说,为断言逻辑中可能需要的东西提供特定的断言方法是无止境的!

更好的方法是提供可组合的测试原语,如equalTo(…)、is(…)、not(…)、regex(…),并让程序员将这些原语拼凑在一起,以获得更好的可读性和合理性。

我也想知道。Assert的API不是很对称;对于测试对象是否相同,它提供了assertSame和assertNotSame。

当然,写起来也不算太长:

assertFalse(foo.equals(bar));

不幸的是,使用这样的断言,输出中唯一有信息的部分是测试方法的名称,因此应该单独形成描述性消息:

String msg = "Expected <" + foo + "> to be unequal to <" + bar +">";
assertFalse(msg, foo.equals(bar));

这当然是非常乏味的,最好是滚动您自己的assertNotEqual。幸运的是,将来它可能会成为JUnit: JUnit第22期的一部分