Это запах кода для шпионажа на объекте, который тестируется устройством? Например, у меня есть класс LineCounter
, задачей которого является просто подсчитать количество строк в строке. -Mockito Spy'ing на проверяемом объекте
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, а не фактический класс, но я не могу думать о причине против него.
Это может быть случай проверки вождения улучшения вашего кода. Похоже, что задача получения метаданных строк должна быть извлечена в другой класс, который затем делегируется 'LineCounter'. В этот момент вы создали «шов» и можете высмеивать эту зависимость более обычным (и менее вонючим) способом. – millhouse
@millhouse Да, полностью согласен, что это похоже на * правильный способ сделать это. Мне интересно, правда, есть ли что-то по своей сути неправильное в моем примере, где тестируемый объект является шпионом? – Matthew