web-dev-qa-db-ja.com

2つ以上の期待値に対して実際の値をアサートする方法は?

メソッドをテストして、正しい文字列を返すかどうかを確認しています。この文字列は、順序が変わる可能性がある多くの行で構成されているため、通常は2つの組み合わせが考えられます。この順序は、私のアプリケーションでは重要ではありません。

ただし、行の順序が変わる可能性があるため、Assertステートメントだけを記述しても機能しません。テストに合格することもあれば、テストに失敗することもあるからです。

それで、2つ以上の期待される文字列値に対して実際の文字列値をアサートし、それがそれらのいずれかに等しいかどうかを確認するテストを書くことは可能ですか?

26
Andrei

Hamcrest CoreMatcher (JUnit 4.4以降に含まれる)とassertThat()を使用する:

assertThat(myString, anyOf(is("value1"), is("value2"));
41
Joachim Sauer

これには AssertJ を使用します。

assertThat("hello").isIn("hello", "world");

より簡潔で、アサーションが失敗したときに説明メッセージが表示されます。

17
Jonathan

これには Hamcrest を使用できます。

assertThat(testString, anyOf(
    containsString("My first string"), 
    containsString("My other string")));

(私はヨアヒムが非常によく似た答えを(+1)しているのを見ます...私はこれを別の例として追加します。)

6
alpian

私は以下を使用しています、これが役に立てば幸いです:

String expectedTitles[] = {"Expected1","Expected2"};
List<String> expectedTitlesList = Arrays.asList(expectedTitles);

assertTrue(expectedTitlesList.contains((actualTitle)));
3
Barun Kumar

私はすべての回答を読みましたが、私にとって最もコンパクトで表現力があると思われるのは、すでにJUnitに含まれているHamcrestのisOneOfを使用することです。

assertThat(result, isOneOf("value1", "value2"));

失敗すると、Niceエラーメッセージが表示されます。

Java.lang.AssertionError: 
Expected: one of {"value1", "value2"}
     but: was "value"
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.Java:20)
[...]
3
fglez

メソッドによって返されるカスタムhamcrestマッチャー(この場合はcontainsOneOf)の記述を検討してください。

assertThat(myString, containsOneOf("value1", "value2"));

「xUnitパターン」を維持するには、マッチャー内の条件付きロジックを回避する必要があります。breakステートメントを使用したループで十分です。

詳細については、 Hamcrest および xUnit Patterns を参照してください。

2
murungu

最も単純/最も効率的なのは

assert str.equals(result1) || str.equals(result2);

アサーションをオンにしていない場合、これは実質的にオーバーヘッドがありません。

1
Peter Lawrey

行の内容が固定されている場合は、比較する前に行末で分割できます。次に、各行を一連の期待値と比較します。このようなもの:

_   Set<String> expectedValues = ...
   String[] split = text.split("\n");
   for(String str : split) {
      assert(expectedValues.contains(str));
   }
_

予想されるすべての値が存在することを確認する場合は、そのexpectedValue.remove(str) == trueをアサートし、ループの後にセットが空であることをアサートできます。一部の行が複数回発生する場合は、セットの代わりにバッグを使用する必要があります。

1
joe776

Junitを使用している場合は、次のようにします。

assertTrue(myString.equals("Value1") || myString.equals("Value"));
1
Tom Jefferys

あなたはassertTrueを使うことができると思います:

assertTrue(testString.matches("string1|string2"));

0
OSrookie

テスト対象のメソッドが配列を返すと仮定すると、Hamcrestの arrayContainingInAnyOrder を使用してテストできます。

assertThat(result, is(arrayContainingInAnyOrder("value1", "value2", "value")))

注:isラッパーの使用は完全にオプションであり、読みやすさの目的でのみ使用されます。

0
Chris Willmore

それは古い投稿ですが、追加のライブラリを追加することなく、ネイティブの簡単な答えを出したかったのです。 :)

だから私はしました:

String e
e = "ear"
j = "jars"

assert (j == "jar" || e == "ear")

または、両方に当てはまる場合

assert (j == "jar" && e == "ear")
0
Marmelin