那麼......想想這個方法的契約:它承諾什麼?它承諾打印一個整數列表,用逗號分隔,並在括號內。所以,你可以在單元測試中指定它。
編輯2:以防萬一你想看單元測試列表是否按順序打印:我不會認爲這是printList
方法的屬性。應該在修改OrderedIntList
的方法中測試此屬性。
使用您希望打印的字符串爲某些列表編寫夾具。不要忘記角落案例:一個空的列表。然後,也許和大小10的一個
大小爲1的列表要檢查哪些已被打印,你可以創建一個新的PrintStream
,並設置System.out
值,通過調用System.setOut
。在每次測試開始時都要這樣做,並且不要忘記重置System.out
(所以不要忘記存儲其原始值)。您使用的PrintStream
無需花哨:您只需要能夠比較打印的流。您可能需要考慮使用Mockito。
編輯:
例如,下面的代碼測試是否含有唯一的元素4
列表,實際打印字符串"[4]\n"
:
@Test
public void aListOfSizeOneShouldPrintTheElementWithinBrackets() {
/* Setup */
final StringBuffer printStream = new StringBuffer();
PrintStream mockedOut = mock(PrintStream.class);
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
printStream.append(invocation.getArguments()[0].toString());
return null;
}
}).when(mockedOut).print(any());
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
printStream.append(invocation.getArguments()[0].toString());
return null;
}
}).when(mockedOut).print(anyString());
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
printStream.append(invocation.getArguments()[0].toString()).append("\n");
return null;
}
}).when(mockedOut).println(any());
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
printStream.append(invocation.getArguments()[0].toString()).append("\n");
return null;
}
}).when(mockedOut).println(anyString());
PrintStream originalOut = System.out;
System.setOut(mockedOut);
/* the actual test */
ArrayList<Integer> listWithOneElement = new ArrayList<Integer>();
listWithOneElement.add(4);
OrderedIntList list = new OrderedIntList(listWithOneElement);
OrderedIntList.printList(list);
MatcherAssert.assertThat(printStream.toString(), is("[4]\n"));
/* Teardown - reset System.out */
System.setOut(originalOut);
}
請注意,你可能要解壓縮安裝 - 和拆解部分在其他測試中使用它,並使您的測試可讀。如果我沒有弄錯,JUnit提供了添加代碼的功能,如果您使用@Before
和@After
註釋指定它,則在每次測試執行前後都會調用代碼。
顯然,你不一定需要Mockito來實現這一點。您也可以編寫一個實現PrintStream
的類並存儲打印的字符串。在這種情況下,Mockito只允許您忽略所有您不關心的方法(即,您不需要實現整個接口)
重複存根的一個小旁註:我們需要存根兩種方法,print
和println
,因爲都使用。另外,由於重寫,print(String x)
與print(Object x)
不一樣,所以我們需要將它們兩者都存根。
我的歉意,善良的先生。 – 2014-09-28 01:29:38