它是一個代碼氣味來窺探正在進行單元測試的對象嗎?例如說我有一個LineCounter
類,其職責是簡單地計算一個字符串中的行數。 -Mockito對被單元測試的對象進行間諜
class LineCounter {
public int getNumLines(String string) {
String metadata = getStringMetadata(string);
// count lines in file
return numLines;
}
/** Expensive operation */
protected String getStringMetadata(String string) {
// do stuff with string
}
}
現在我想寫一個JUnit 4測試這個測試getNumLines
方法,同時嘲諷了昂貴getStringMetadata
電話。我決定使用Mockito的間諜機制讓getStringMetadata
返回一個虛擬值。
class LineCounterTests {
@Test public void testGetNumLines() {
LineCounter lineCounterSpy = Mockito.spy(new LineCounter());
// Mock out expensive call to return dummy value.
Mockito.when(lineCounterSpy.getStringMetadata(Mockito.anyString()).thenReturn("foo");
assertEquals(2, lineCounterSpy.getNumLines("hello\nworld");
}
}
這是一個合理的事情嗎?我覺得測試一個間諜對象,而不是實際的類非常奇怪,但我真的不能想出一個反對它的理由。
這可能是一個測試驅動你的代碼改進的情況。它看起來像獲取字符串元數據的工作應該被提取到另一個類,然後由'LineCounter'委託給另一個類。那時你已經創建了一個「接縫」,並且可以用更傳統的方式嘲笑這種依賴性(並且不會那麼臭) – millhouse
@millhouse是的,完全同意這種方式看起來像是正確的方法。我想知道,在我的例子中,被測試的對象是間諜是否存在內在的錯誤? – Matthew