我需要测试一些遗留代码,它在方法调用中使用单身人士。测试的目的是确保clas sunder测试调用singletons方法。 我已经看到过类似的问题,但所有的答案都需要其他的依赖(不同的测试框架) - 不幸的是我仅限于使用Mockito和JUnit,但这种流行的框架应该是完全可能的。用mockito嘲笑一个单身人士
单例:
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然后formatTachoIcon方法。不幸的是,这会失败,并显示错误消息:
when() requires an argument which has to be 'a method call on a mock'.
你不能做到这一点的Mockito中,也没有使用PowerMock,除非你重构你的类之一。但我不确定你为什么想要。你只用一行来单元测试一个方法,而没有内部逻辑。这不能失败。在别处花费您的测试工作。 –
“测试的目的是确保clas sunder测试调用singletons方法。”没有好的测试案例应该有这样的事情作为它的目的。相反,目标是测试一些有意义的业务功能。嘲笑依赖关系并验证方法被调用不一定是错误的,但它应该只在需要的时候完成。 –