有没有最好的方法来使用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 发生更改,例如通过从依赖项调用另一个方法,我将不得不在使用 JMock 的情况下手动修改测试。有没有办法避免它?
附言对不起我的英语
如果你真的想,你可以使用allowing(dependency)
,这将允许对象上的所有内容。
不支持"好"模拟是有原因的,那就是我们不希望代码中任意发生一些事情,而不将其从单元测试中驱动出来。总的来说,我们发现这种脆性来自我们设计的弱点,我们使用测试反馈来帮助我们发现这一点。
在这个例子中,我会对不同依赖方法之间的关系,即"协议"感兴趣。我想隔离它,以便它实现一次,这意味着我只需要在一次地方测试它,所以一个"好"的模拟不会那么有用。