为什么JUnit不提供assertNotEquals方法?
有谁知道为什么JUnit 4提供了assertEquals(foo,bar)
而不是assertNotEqual(foo,bar)
方法吗?
它提供了assertNotSame
(对应于assertSame
)和assertSame
(对应于assertSame
),所以似乎很奇怪的是,他们并不打扰包括assertNotEqual
。
顺便说一句,我知道JUnit插件提供了我正在寻找的方法。 我只是出于好奇而问。
我build议你使用新的assertThat()
风格断言,它可以很容易地描述各种否定,并自动build立一个你期望什么和你得到什么,如果断言失败的描述:
assertThat(objectUnderTest, is(not(someOtherObject))); assertThat(objectUnderTest, not(someOtherObject)); assertThat(objectUnderTest, not(equalTo(someOtherObject)));
所有三个选项是相同的,select一个你最可读的。
要使用方法的简单名称(并允许使用这种时态语法),您需要这些导入:
import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*;
在JUnit 4.11中有一个assertNotEquals
: https : //github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assume
import static org.junit.Assert.assertNotEquals;
我也好奇。 Assert的API不是很对称; 为了testing对象是否相同,它提供了assertSame
和assertNotSame
。
当然,写这个不会太长:
assertFalse(foo.equals(bar));
有了这样一个断言,输出的唯一信息部分不幸是testing方法的名称,所以描述性信息应该分开形成:
String msg = "Expected <" + foo + "> to be unequal to <" + bar +">"; assertFalse(msg, foo.equals(bar));
这当然是很乏味的,所以最好是推出自己的assertNotEqual
。 幸运的是,将来它可能会成为JUnit的一部分: JUnit 22期
我认为assertNotEqual的缺失确实是一种不对称,使得JUnit有点不可学。 请注意,添加一个方法会降低API的复杂性,至less对我来说这是一个很好的例子:对称性有助于统治更大的空间。 我的猜测是,这个遗漏的原因可能是人们要求这个方法的人太less了。 但是,我记得有一段时间,即使断言“假”不存在, 因此,我有一个积极的期望,即该方法可能最终被添加,因为这不是一个困难的方法; 即使我承认有很多解决方法,甚至是优雅的。
我很晚才来参加这个派对,但是我发现这个forms:
static void assertTrue(java.lang.String message, boolean condition)
可以使大多数“不平等”的情况下工作。
int status = doSomething() ; // expected to return 123 assertTrue("doSomething() returned unexpected status", status != 123 ) ;
人们想要assertNotEquals()的显而易见的原因是比较内build函数,而不必先将它们转换为完整的对象:
详细例子:
.... assertThat(1, not(equalTo(Integer.valueOf(winningBidderId)))); ....
与
assertNotEqual(1, winningBidderId);
不幸的是,由于Eclipse默认不包含JUnit 4.11,所以你必须是冗长的。
警告我不认为'1'需要包裹在Integer.valueOf(),但因为我刚从.NET返回不指望我的正确性。
我正在使用jUnit4.12在java 8环境中使用JUnit
对我来说:编译器无法findassertNotEquals方法,即使在我使用时也是如此
import org.junit.Assert;
所以我改变了
assertNotEquals("addb", string);
至
Assert.assertNotEquals("addb", string);
所以如果你遇到了assertNotEqual
不能被识别的问题,那么把它Assert.assertNotEquals(,);
它应该解决你的问题
使用Hamcrest进行否定断言比断言False更好,因为前者的testing报告将显示断言失败的差异。
如果你使用assertFalse,你只是在报告中断言失败。 即失去了失败原因的信息。
Modulo API的一致性,为什么JUnit没有提供assertNotEquals()
是为什么JUnit从来没有提供类似的方法
-
assertStringMatchesTheRegex(regex, str)
与assertStringDoesntMatchTheRegex(regex, str)
-
assertStringBeginsWith(prefix, str)
vsassertStringDoesntBeginWith(prefix, str)
即为断言逻辑中可能需要的各种事物提供特定的断言方法是无止境的!
最好提供像equalTo(...)
这样的可组合的testing原语, is(...)
, not(...)
, regex(...)
,让程序员把它们拼凑起来,以提高可读性和完整性。