我測試一個方法,看看它是否返回正確的字符串。這個字符串是由很多行的順序可能會改變的,因此通常會給出2種可能的組合。該順序對我的應用程序並不重要。如何將實際值與2個或更多預期值相關聯?
但是,因爲行的順序可能會改變,所以只寫一個Assert語句將不起作用,因爲它有時會通過測試,有時會通過測試。
那麼,是否有可能編寫一個測試,將一個實際的字符串值與2個或更多個預期的字符串值相對照,並查看它是否與它們中的任何一個相等?
我測試一個方法,看看它是否返回正確的字符串。這個字符串是由很多行的順序可能會改變的,因此通常會給出2種可能的組合。該順序對我的應用程序並不重要。如何將實際值與2個或更多預期值相關聯?
但是,因爲行的順序可能會改變,所以只寫一個Assert語句將不起作用,因爲它有時會通過測試,有時會通過測試。
那麼,是否有可能編寫一個測試,將一個實際的字符串值與2個或更多個預期的字符串值相對照,並查看它是否與它們中的任何一個相等?
使用Hamcrest CoreMatcher
(包含在JUnit 4.4的和更高版本)和assertThat()
:
assertThat(myString, anyOf(is("value1"), is("value2"));
如果某一行的內容是固定的,則可以在比較之前將其分割爲行尾。然後簡單地將每一行與一組預期值進行比較。 事情是這樣的:
Set<String> expectedValues = ...
String[] split = text.split("\n");
for(String str : split) {
assert(expectedValues.contains(str));
}
如果要檢查所有的預期值都存在,你可以斷言,expectedValue.remove(str) == true
和環路設置爲空後斷言。如果某些行可能多次出現,則必須使用Bag而不是Set。
如果您使用JUnit我只是做一些這樣的:
assertTrue(myString.equals("Value1") || myString.equals("Value"));
您可以使用Hamcrest爲此:
assertThat(testString, anyOf(
containsString("My first string"),
containsString("My other string")));
(我看見Joa詹只是回答非常相似(+1)...我會添加爲另一個例子)
考慮寫一個方法返回一個自定義hamcrest匹配,在這種情況下containsOneOf
,即:
assertThat(myString, containsOneOf("value1", "value2"));
爲了與「xUnit模式」保持一致,您應該避免在匹配器中使用條件邏輯,但使用break語句的循環就足夠了。
查看Hamcrest和xUnit Patterns瞭解更多信息。
最簡單/最有效的可能是
assert str.equals(result1) || str.equals(result2);
這將有效地沒有開銷,當你沒有斷言開啓。
但在Android工作室中,我發現斷言在我的儀器化測試中未得到評估。我需要使用assertTrue而不是 – likejiujitsu 2016-08-26 17:28:22
@likejiujitsu您需要確保-ea是命令行選項。 assertEquals最適合測試,但只能在生產中使用assert,因此可以關閉。 – 2016-08-26 22:21:30
'assert.assertequals(expected,actual)'不允許'||'運算符 – Sanchit 2018-03-07 05:10:20
我使用的是以下幾點:
assert expected1.equals(actual) || expected2.equals(actual);
假設下的測試方法返回一個數組,你可以測試使用Hamcrest的arrayContainingInAnyOrder。
assertThat(result, is(arrayContainingInAnyOrder("value1", "value2", "value")))
注:使用is
包裝的純粹是可選的,僅作爲可讀性糖。
我使用下面,我希望這將有助於:
String expectedTitles[] = {"Expected1","Expected2"};
List<String> expectedTitlesList = Arrays.asList(expectedTitles);
assertTrue(expectedTitlesList.contains((actualTitle)));
誰使用的junit斷言 '字符串expectedTitles [] = { 「處理中」, 「已完成」};'' 列表
我讀了所有的答案,但似乎最緊湊和表現給我的一個使用Hamcrest的isOneOf
其中已經包含在JUnit的
assertThat(result, isOneOf("value1", "value2"));
這給你一個很好的錯誤信息失敗時。
java.lang.AssertionError:
Expected: one of {"value1", "value2"}
but: was "value"
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
[...]
我最終設法解決了這個問題,但由於某種原因,對我而言,JUnit 4在CoreMatcher中沒有'assertThat'方法。我最終將主Hamcrest庫與JUnit庫結合起來,以使其正常工作。 – Andrei 2011-05-17 13:37:44
@Andrei:'assertThat'在'org.junit.Assert'中找到。 – 2011-05-17 13:38:43
不適合我...我只看到assertTrue – Andrei 2011-05-17 13:43:38