メソッドをテストして、正しい文字列を返すかどうかを確認しています。この文字列は、順序が変わる可能性がある多くの行で構成されているため、通常は2つの組み合わせが考えられます。この順序は、私のアプリケーションでは重要ではありません。
ただし、行の順序が変わる可能性があるため、Assertステートメントだけを記述しても機能しません。テストに合格することもあれば、テストに失敗することもあるからです。
それで、2つ以上の期待される文字列値に対して実際の文字列値をアサートし、それがそれらのいずれかに等しいかどうかを確認するテストを書くことは可能ですか?
Hamcrest CoreMatcher
(JUnit 4.4以降に含まれる)とassertThat()
を使用する:
assertThat(myString, anyOf(is("value1"), is("value2"));
これには Hamcrest を使用できます。
assertThat(testString, anyOf(
containsString("My first string"),
containsString("My other string")));
(私はヨアヒムが非常によく似た答えを(+1)しているのを見ます...私はこれを別の例として追加します。)
私は以下を使用しています、これが役に立てば幸いです:
String expectedTitles[] = {"Expected1","Expected2"};
List<String> expectedTitlesList = Arrays.asList(expectedTitles);
assertTrue(expectedTitlesList.contains((actualTitle)));
私はすべての回答を読みましたが、私にとって最もコンパクトで表現力があると思われるのは、すでに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)
[...]
メソッドによって返されるカスタムhamcrestマッチャー(この場合はcontainsOneOf
)の記述を検討してください。
assertThat(myString, containsOneOf("value1", "value2"));
「xUnitパターン」を維持するには、マッチャー内の条件付きロジックを回避する必要があります。breakステートメントを使用したループで十分です。
詳細については、 Hamcrest および xUnit Patterns を参照してください。
最も単純/最も効率的なのは
assert str.equals(result1) || str.equals(result2);
アサーションをオンにしていない場合、これは実質的にオーバーヘッドがありません。
行の内容が固定されている場合は、比較する前に行末で分割できます。次に、各行を一連の期待値と比較します。このようなもの:
_ Set<String> expectedValues = ...
String[] split = text.split("\n");
for(String str : split) {
assert(expectedValues.contains(str));
}
_
予想されるすべての値が存在することを確認する場合は、そのexpectedValue.remove(str) == true
をアサートし、ループの後にセットが空であることをアサートできます。一部の行が複数回発生する場合は、セットの代わりにバッグを使用する必要があります。
Junitを使用している場合は、次のようにします。
assertTrue(myString.equals("Value1") || myString.equals("Value"));
あなたはassertTrueを使うことができると思います:
assertTrue(testString.matches("string1|string2"));
テスト対象のメソッドが配列を返すと仮定すると、Hamcrestの arrayContainingInAnyOrder を使用してテストできます。
assertThat(result, is(arrayContainingInAnyOrder("value1", "value2", "value")))
注:is
ラッパーの使用は完全にオプションであり、読みやすさの目的でのみ使用されます。
それは古い投稿ですが、追加のライブラリを追加することなく、ネイティブの簡単な答えを出したかったのです。 :)
だから私はしました:
String e
e = "ear"
j = "jars"
assert (j == "jar" || e == "ear")
または、両方に当てはまる場合
assert (j == "jar" && e == "ear")