JMockit级联和接口

时间:2014-07-16 09:03:03

标签: junit4 jmockit method-chaining

我正在尝试模拟从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?

提前致谢。

1 个答案:

答案 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的方法的默认值。