0

有没有使用 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。有没有办法避免呢?

PS对不起我的英语

4

1 回答 1

2

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

我们不支持“漂亮”的模拟是有原因的,那就是我们不希望在没有从单元测试中驱动的情况下在我们的代码中任意发生一些事情。总的来说,我们发现这种脆弱性来自我们设计的弱点,我们使用测试反馈来帮助我们发现这一点。

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

于 2012-11-15T09:21:59.343 回答