Мне нужно протестировать некоторый унаследованный код, который использует одноэлемент в вызове метода. Целью теста является обеспечение того, чтобы тест clas sunder вызывал метод одиночных чисел. Я видел похожие вопросы по SO, но все ответы требуют других зависимостей (разные тестовые среды). К сожалению, я ограничена использованием Mockito и JUnit, но это должно быть совершенно возможно с такой популярной структурой.
Синглтон:
public class FormatterService {
private static FormatterService INSTANCE;
private FormatterService() {
}
public static FormatterService getInstance() {
if (INSTANCE == null) {
INSTANCE = new FormatterService();
}
return INSTANCE;
}
public String formatTachoIcon() {
return "URL";
}
}
Испытуемый класс:
public class DriverSnapshotHandler {
public String getImageURL() {
return FormatterService.getInstance().formatTachoIcon();
}
}
unit test:
public class TestDriverSnapshotHandler {
private FormatterService formatter;
@Before
public void setUp() {
formatter = mock(FormatterService.class);
when(FormatterService.getInstance()).thenReturn(formatter);
when(formatter.formatTachoIcon()).thenReturn("MockedURL");
}
@Test
public void testFormatterServiceIsCalled() {
DriverSnapshotHandler handler = new DriverSnapshotHandler();
handler.getImageURL();
verify(formatter, atLeastOnce()).formatTachoIcon();
}
}
Идея состояла в том, чтобы настроить ожидаемое поведение страшного синглтона, так как тестируемый класс будет называть его getInstance, а затем formatTachoIcon. К сожалению, это не удается с сообщением об ошибке:
when() requires an argument which has to be 'a method call on a mock'.