441

assertEquals(foo,bar)JUnit 4がメソッドを提供するのに、メソッドを提供しない理由を誰かが知っていassertNotEqual(foo,bar)ますか?

assertNotSame(に対応するassertSame)とassertFalse(に対応する)を提供しassertTrueているので、を含めて気にしないのは不思議に思えassertNotEqualます。

ちなみに、私はJUnitアドオンが私が探しているメソッドを提供することを知っています。好奇心からお願いしているだけです。

4

11 に答える 11

409

新しいスタイルのアサーションを使用することをお勧めしますassertThat()。これは、あらゆる種類の否定を簡単に記述し、期待したものとアサーションが失敗した場合に得たものの記述を自動的に作成できます。

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

3 つのオプションはすべて同等です。最も読みやすいものを選択してください。

メソッドの単純な名前を使用する (そしてこの緊張した構文が機能するようにする) には、次のインポートが必要です。

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
于 2009-09-23T07:14:07.727 に答える
161

assertNotEqualsJUnit 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;
于 2012-07-13T08:46:00.747 に答える
51

私は同じだろうか。Assert の API はあまり対称的ではありません。オブジェクトが同じかどうかをテストするために、 と を提供assertSameassertNotSameます。

もちろん、書くのに長すぎることはありません。

assertFalse(foo.equals(bar));

このようなアサーションでは、残念ながら出力の唯一の情報部分はテスト メソッドの名前であるため、説明的なメッセージは個別に作成する必要があります。

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

もちろん、これは非常に面倒なので、自分で作成したほうがよいでしょうassertNotEqual。幸いなことに、将来的には JUnit の一部になる可能性があります: JUnit issue 22

于 2009-07-08T08:26:16.417 に答える
13

assertNotEqual が存在しないことは確かに非対称性であり、JUnit の学習が少し難しくなると私は主張します。少なくとも私にとっては、メソッドを追加することで API の複雑さが軽減される場合、これは適切なケースであることに注意してください。対称性は、より大きなスペースを支配するのに役立ちます。私の推測では、このメソッドを呼び出す人が少なすぎることが、省略の理由である可能性があります。それでも、assertFalse さえ存在しなかった時代を覚えています。したがって、難しいものではないことを考えると、メソッドが最終的に追加される可能性があるという前向きな期待があります。たとえ洗練されたものであっても、多くの回避策があることは認めています。

于 2011-05-25T15:11:58.250 に答える
7

私はかなり遅れてこのパーティーに来ていますが、次の形式であることがわかりました。

static void assertTrue(java.lang.String message, boolean condition) 

ほとんどの「等しくない」ケースで機能させることができます。

int status = doSomething() ; // expected to return 123
assertTrue("doSomething() returned unexpected status", status != 123 ) ;
于 2012-07-12T16:34:42.713 に答える
6

jUnit4.12を使用して、Java 8環境でJUnitに取り組んでいます

私にとって:コンパイラは、使用した場合でも、メソッドassertNotEqualsを見つけることができませんでした
import org.junit.Assert;

だから私はに変更
assertNotEquals("addb", string);
しました
Assert.assertNotEquals("addb", string);

したがって、認識されないという問題に直面している場合はassertNotEqual、それを変更してAssert.assertNotEquals(,);問題を解決する必要があります

于 2016-03-08T13:16:31.097 に答える
3

人々が assertNotEquals() を望んでいた明らかな理由は、最初に完全なオブジェクトに変換することなく組み込みを比較することでした:

詳細な例:

....
assertThat(1, not(equalTo(Integer.valueOf(winningBidderId))));
....

対。

assertNotEqual(1, winningBidderId);

悲しいことに、Eclipse にはデフォルトで JUnit 4.11 が含まれていないため、冗長にする必要があります。

警告「1」を Integer.valueOf() でラップする必要はないと思いますが、.NET から新しく返されたので、私の正しさを当てにしないでください。

于 2012-12-17T20:17:05.610 に答える
2

否定的なアサーションには、assertFalse よりも Hamcrest を使用することをお勧めします。前者の場合、テスト レポートにはアサーションの失敗の差分が表示されます。

assertFalse を使用すると、レポートにアサーション エラーが表示されます。つまり、障害の原因に関する情報が失われます。

于 2010-11-25T16:42:59.640 に答える
-1

Modulo APIの一貫性、JUnitが提供しなかったassertNotEquals()理由は、JUnitが次のようなメソッドを提供しなかった理由と同じです

  • assertStringMatchesTheRegex(regex, str)対。assertStringDoesntMatchTheRegex(regex, str)
  • assertStringBeginsWith(prefix, str)対。assertStringDoesntBeginWith(prefix, str)

つまり、アサーション ロジックに必要な種類の特定のアサーション メソッドを提供することに終わりはありません。

、、、などの構成可能なテスト プリミティブを提供する方がはるかに優れておりequalTo(...)、読みやすさと健全性を高めるためにis(...)、代わりにプログラマーがそれらをつなぎ合わせることができます。not(...)regex(...)

于 2013-03-25T14:10:14.010 に答える