为什么JUnit不提供assertNotEquals方法?

Chr*_*s B 421 java junit assert

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

它提供assertNotSame(对应assertSame)和assertFalse(对应assertTrue),所以看起来很奇怪他们没有打扰包括assertNotEqual.

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

Joa*_*uer 399

我建议你使用更新的assertThat()样式断言,它可以很容易地描述所有类型的否定,并自动构建一个描述你期望的和断言失败时得到的东西:

assertThat(objectUnderTest, is(not(someOtherObject)));
assertThat(objectUnderTest, not(someOtherObject));
assertThat(objectUnderTest, not(equalTo(someOtherObject)));
Run Code Online (Sandbox Code Playgroud)

所有三个选项都是等效的,选择您认为最易读的选项.

要使用方法的简单名称(并允许此时序语法起作用),您需要以下导入:

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
Run Code Online (Sandbox Code Playgroud)

  • 我很欣赏指向备用断言语法的指针,但指向其他地方并不回答*为什么*JUnit从未提供过`assertNotEquals()`. (134认同)
  • "选择你认为最具可读性的那个".阅读和编写单元测试的人都是程序员.他们真的发现这比assertNotEqual(objectUnderTest,someOtherObject)或assertFalse(objectUnderTest.equals(someOtherObject))更具可读性吗?我不相信花哨的匹配器API - 程序员探索/发现如何使用它们似乎相当困难...... (21认同)
  • @seh:我读它的方式问题不是关于历史的兴趣,而是关于在JUnit测试中制定断言"这两个对象不相等"的方法.我回答了.考虑到"为什么没有`assertNotEqual`"我会说这是因为它是一个专门的断言,它不像`assertEquals`那样经常需要,因此会通过通用的`assertFalse`来表达. (14认同)
  • 还导入静态org.junit.Assert.assertThat; (10认同)
  • @Joachim我同意`assertThat`比`assert*`更具表现力,但我认为它不比你可以放入`assert*'表达式的java表达式更具表现力(毕竟我可以在java代码中表达任何内容).这是一个普遍的问题,我开始遇到流畅的API - 每个人基本上都是一个你需要学习的新DSL(当我们都知道Java的时候!).我认为Hamcrest现在已经无处不在了,但是期望人们知道它是合理的.我会玩的... (5认同)

Ste*_*ner 150

assertNotEquals在JUnit 4.11中有一个:https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assume

import static org.junit.Assert.assertNotEquals;
Run Code Online (Sandbox Code Playgroud)

  • 我使用4.12但仍然无法找到assertNotEqual.:■ (6认同)

Mik*_*unu 49

我不知道.Assert的API不是很对称; 为了测试对象是否相同,它提供assertSameassertNotSame.

当然,写作时间不会太长:

assertFalse(foo.equals(bar));
Run Code Online (Sandbox Code Playgroud)

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

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

这当然是如此乏味,最好自己动手assertNotEqual.幸运的是,将来它可能是JUnit的一部分:JUnit问题22

  • 但这没那么有用,因为JUnit无法生成有用的失败消息,告诉您,例如,foo和bar的不等值.真正的失败原因是隐藏的,并变成一个简单的布尔值. (19认同)
  • 我完全同意.特别是assertFalse需要正确的消息参数来产生输出以告诉真正出错的地方. (3认同)

小智 13

我认为缺少assertNotEqual确实是不对称的,并且使JUnit的可学性有点差.请注意,添加方法时这是一个简洁的案例会降低API的复杂性,至少对我而言:对称性有助于统治更大的空间.我的猜测是遗漏的原因可能是人们要求这种方法的人太少了.然而,我记得甚至断言不存在的时候; 因此,我有一个积极的期望,最终可能会添加该方法,因为它不是一个困难的方法; 即使我承认有很多变通方法,甚至是优雅的变通办法.


use*_*724 7

我很晚才参加这个派对,但我发现这个形式:

static void assertTrue(java.lang.String message, boolean condition) 
Run Code Online (Sandbox Code Playgroud)

可以用于大多数'不等于'的情况.

int status = doSomething() ; // expected to return 123
assertTrue("doSomething() returned unexpected status", status != 123 ) ;
Run Code Online (Sandbox Code Playgroud)

  • 虽然这确实有效,但问题是如果断言失败,它只会说"Exepcted true,but false",或者其他一些不清楚的陈述.如果它是预期的不是123,那将是伟大的,但是123. (4认同)

Aks*_*ain 6

我正在使用jUnit4.12在java 8环境中使用JUnit

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

所以我改变了
assertNotEquals("addb", string);

Assert.assertNotEquals("addb", string);

因此,如果您遇到assertNotEqual无法识别的问题,那么将其更改为Assert.assertNotEquals(,);可以解决您的问题

  • 那是因为这些方法是静态的,您必须静态导入它们。使用这个`import static org.junit.Assert.*;`,你将能够使用所有没有类名的断言。 (2认同)