如何使用JMock制作一个“漂亮的模拟器”?

时间:2012-11-15 03:38:57

标签: unit-testing mocking mockito jmock

使用JMock是否有最好的方法来制作漂亮的模拟

例如:

public interface Dependency {
    void someSetUp();
    void interactionUnderTest();
    void someCleaningAfterWork();
}

public class CUT {
    private Dependency dependency;

    public void methodUnderTest() {
        dependency.someSetUp();
        dependency.interactionUnderTest();
        dependency.someCleaningAfterWork();
    }

    public void setDepencency(Dependency dependency) {
        this.dependency = dependency;
    }
}

对于Mockito来说,解决方案很简单:

@Test
public void mockitoExample() throws Exception {
    Dependency dependency = mock(Dependency.class);
    classUnderTest.setDepencency(dependency);
    classUnderTest.methodUnderTest();
    verify(dependency).interactionUnderTest();
}

但对于JMock,我发现只有这个解决方案:

@Test
public void jMockExample() throws Exception {
    JUnit4Mockery ctx = new JUnit4Mockery();
    final Dependency dependency = ctx.mock(Dependency.class);
    classUnderTest.setDepencency(dependency);
    ctx.checking(new Expectations() {{
        allowing(dependency).someSetUp();
        one(dependency).interactionUnderTest();
        allowing(dependency).someCleaningAfterWork();
    }});

    classUnderTest.methodUnderTest();
}

问题在于以下几点:

allowing(dependency).someSetUp();
and
allowing(dependency).someCleaningAfterWork();

如果methodUnderTest发生更改,例如通过从Dependency调用另一个方法,我将不得不在使用JMock的情况下手动修改测试。有没有办法避免它?

P.S。抱歉我的英文

1 个答案:

答案 0 :(得分:2)

如果您真的想要,可以使用allowing(dependency),这将允许对象上的所有内容。

有一个原因是我们不支持“好”的模拟,这是因为我们不希望在代码中任意发生任何事情而不将其从单元测试中驱逐出去。总的来说,我们发现这种脆弱性来自于我们设计的弱点,我们使用测试反馈来帮助我们发现它。

在这个例子中,我会对关系,不同依赖方法之间的“协议”感兴趣。我想隔离它,以便它实现一次,这意味着我只需要在一次测试它,所以一个“好”的模拟将不会有用。