用 mockito 嘲笑单例
2022-08-31 20:14:01
我需要测试一些遗留代码,这些代码在方法调用中使用单一实例。测试的目的是确保 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();
}
}
单元测试:
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,然后格式化TachoIcon方法。不幸的是,这将失败,并显示一条错误消息:
when() requires an argument which has to be 'a method call on a mock'.