2011-05-17 35 views
14

我測試一個方法,看看它是否返回正確的字符串。這個字符串是由很多行的順序可能會改變的,因此通常會給出2種可能的組合。該順序對我的應用程序並不重要。如何將實際值與2個或更多預期值相關聯?

但是,因爲行的順序可能會改變,所以只寫一個Assert語句將不起作用,因爲它有時會通過測試,有時會通過測試。

那麼,是否有可能編寫一個測試,將一個實際的字符串值與2個或更多個預期的字符串值相對照,並查看它是否與它們中的任何一個相等?

回答

28

使用Hamcrest CoreMatcher(包含在JUnit 4.4的和更高版本)和assertThat()

assertThat(myString, anyOf(is("value1"), is("value2")); 
+0

我最終設法解決了這個問題,但由於某種原因,對我而言,JUnit 4在CoreMatcher中沒有'assertThat'方法。我最終將主Hamcrest庫與JUnit庫結合起來,以使其正常工作。 – Andrei 2011-05-17 13:37:44

+2

@Andrei:'assertThat'在'org.junit.Assert'中找到。 – 2011-05-17 13:38:43

+0

不適合我...我只看到assertTrue – Andrei 2011-05-17 13:43:38

1

如果某一行的內容是固定的,則可以在比較之前將其分割爲行尾。然後簡單地將每一行與一組預期值進行比較。 事情是這樣的:

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

如果要檢查所有的預期值都存在,你可以斷言,expectedValue.remove(str) == true和環路設置爲空後斷言。如果某些行可能多次出現,則必須使用Bag而不是Set。

2

如果您使用JUnit我只是做一些這樣的:

assertTrue(myString.equals("Value1") || myString.equals("Value")); 
5

您可以使用Hamcrest爲此:

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

(我看見Joa詹只是回答非常相似(+1)...我會添加爲另一個例子)

1

考慮寫一個方法返回一個自定義hamcrest匹配,在這種情況下containsOneOf,即:

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

爲了與「xUnit模式」保持一致,您應該避免在匹配器中使用條件邏輯,但使用break語句的循環就足夠了。

查看HamcrestxUnit Patterns瞭解更多信息。

1

最簡單/最有效的可能是

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

這將有效地沒有開銷,當你沒有斷言開啓。

+1

但在Android工作室中,我發現斷言在我的儀器化測試中未得到評估。我需要使用assertTrue而不是 – likejiujitsu 2016-08-26 17:28:22

+0

@likejiujitsu您需要確保-ea是命令行選項。 assertEquals最適合測試,但只能在生產中使用assert,因此可以關閉。 – 2016-08-26 22:21:30

+0

'assert.assertequals(expected,actual)'不允許'||'運算符 – Sanchit 2018-03-07 05:10:20

14

我會用AssertJ此:

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

它更簡潔,當斷言失敗,它會給你一個描述性的消息。

0

我使用的是以下幾點:

assert expected1.equals(actual) || expected2.equals(actual); 
0

假設下的測試方法返回一個數組,你可以測試使用Hamcrest的arrayContainingInAnyOrder

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

注:使用is包裝的純粹是可選的,僅作爲可讀性糖。

1

我使用下面,我希望這將有助於:

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

assertTrue(expectedTitlesList.contains((actualTitle))); 
+0

誰使用的junit斷言 '字符串expectedTitles [] = { 「處理中」, 「已完成」};'' 列表 expectedTitlesList = Arrays.asList(expectedTitles);'' Assert.assertTrue(expectedTitlesList.contains( (transferRequest.getRequestStatus())));' – Extreme 2017-06-25 21:58:51

0

我讀了所有的答案,但似乎最緊湊和表現給我的一個使用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) 
[...] 
相關問題