Jmockit:验证接口字段

时间:2016-12-02 01:02:56

标签: java unit-testing junit jmockit

使用的JMockit版本:1.21 我有这样的界面。 TestInterface:

public interface TestInterface {
    boolean callMethod();
}

TestClass has field是该接口的一个实例 识别TestClass:

public class TestClass {
    private final TestInterface inner = new TestInterface() {
        @Override
        public boolean callMethod() {
            subMethod();
            return false;
        }
    };
        public void subMethod() { System.out.println("Sub method");
    };
}

我尝试在本教程中通过假接口验证调用方法。 http://jmockit.org/tutorial/Faking.html#interfacesd

测试方法。

public class TestInterfaceTest {
    TestClass sut;
    @Before
    public void setUp() {
        sut = Deencapsulation.newInstance(TestClass.class);
    }
    @Test
    public void mockAllClassesImplementingAnInterface() {

        TestInterface testInterface = new MockUp<TestInterface>() {
            @Mock
            public boolean callMethod(Invocation inv) {
                inv.proceed(); // throw exception here -> Will my expected method  be called here?
                return true;
            }
        }.getMockInstance();

        Deencapsulation.setField(sut, "INTER", testInterface);

        new NonStrictExpectations() {
            {
                Deencapsulation.invoke(sut, "subMethod");
            }
        };

        Boolean result = Deencapsulation.invoke(Deencapsulation.getField(sut, "INTER"), "callMethod");

        assertTrue(result);

        new Verifications() {
            {
                Deencapsulation.invoke(sut, "subMethod"); times = 1;
            }
        };
    }
}
  

java.lang.IllegalArgumentException:没有名称的类   “ndroid.examples.helloandroid。$ Impl_TestInterface”找到了

如果你们不介意的话,请你告诉我如何解决这个问题。非常感谢。

2 个答案:

答案 0 :(得分:2)

在我对这个问题的重新评估中,你的问题似乎在于inv.proceed()。您不能在界面的Mockup中拥有该行。

当您希望Invocation.proceed()实现进入实际代码时,

MockUp是预期的。但是因为你在嘲笑一个界面,没有真正的代码。您可能认为存在因为TestClass的实现具有接口的匿名实现,但MockUp对该匿名类一无所知;它正在做一个界面的模型,而不是你的匿名实现。

如果你摆脱了这一行,打电话给Invocation.proceed(),我想你会发现你的错误消失了。

答案 1 :(得分:-1)

基于@dcsohl的指导。下面的代码对我有用。

    @Test
    public void mockAllClassesImplementingAnInterface() {
        // Partial mocking
        new NonStrictExpectations(sut) {
            {
                sut.subMethod();
            }
        };

        // Actual invocation
        Deencapsulation.invoke(Deencapsulation.getField(sut, "inner"), "callMethod");
        // Verify
        new Verifications() {
            {
                Deencapsulation.invoke(sut, "subMethod");
                times = 1;
            }
        };
    }