単体テストされているオブジェクトをスパイするのはコードの匂いですか? たとえば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
}
}
ここで、高価な呼び出しgetNumLines
をモックアウトしながらメソッドをテストするために、JUnit 4 テストを作成したいと考えています。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 オブジェクトをテストするのはかなり奇妙に感じますが、それに対する理由は本当に思いつきません。