我正在尝试模拟从ClassUnderTest.methodUnderTest调用的以下方法调用链:
((AService) System.getService(AService.NAME)).isA();
其中声明System.getService静态方法返回Service接口,但返回基于传递的字符串参数的具体子类。 isA()是AService子类的一个方法,在Service接口上不存在,因此需要强制转换。
我正在使用JMockit(1.8)并尝试模拟调用链,如下所示
public class TestCascadingMock {
@Test
public void testMethodUnderTest(@Cascading System system) {
new Expectations(system) {{
((AService) System.getService(AService.NAME)).isA();
result = false;
}};
ClassUnderTest c = new ClassUnderTest();
boolean isA = c.methodUnderTest();
assertFalse(isA);
}
}
这导致了ClassCastException
java.lang.ClassCastException: org.gwl.test.$Impl_Service cannot be cast to org.gwl.test.AService
at org.gwl.test.TestCascadingMock$1.<init>(TestCascadingMock.java:14)
at org.gwl.test.TestCascadingMock.testMethodUnderTest(TestCascadingMock.java:13)
我可以理解这个重复告诉我的内容 - JMockit只能返回一个模拟的Service实现,而不是AService - 但是如何指定我总是希望这个调用返回false?
提前致谢。
答案 0 :(得分:1)
按如下方式编写测试:
@Test
public void testMethodUnderTest(
@Mocked System system, @Mocked final AService aService)
{
new NonStrictExpectations() {{
System.getService(AService.NAME); result = aService;
aService.isA(); result = false;
}};
ClassUnderTest c = new ClassUnderTest();
boolean isA = c.methodUnderTest();
assertFalse(isA);
}
请注意,如果需要,可以删除aService.isA()
期望,因为false
是返回boolean
的方法的默认值。