监视正在单元测试的对象是否是代码异味?例如,假设我有一个LineCounter
类,其工作是简单地计算字符串中的行数。--
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");
}
}
这是合理的做法吗?我觉得测试一个 Spy 对象而不是实际的类很奇怪,但我真的想不出反对它的理由。