让测试通过一组JMock的模拟方法调用

时间:2019-01-11 16:31:17

标签: java unit-testing testing jmock

在达到给定模拟的方法调用的执行时,JMock2中是否有任何方法可以让测试通过? 换句话说,我想编写一些测试代码,例如:

assertTrue(when(aRequestMock).methodCall());

要测试生产代码,例如:

public void methodUnderTest(){
   // Some initialization code and members call
   request.foo();
   String a = anotherInstance.bar();
   // many more calls to follow
}

...所以我不需要模拟'anotherInstance.bar()'的返回值以及要跟随的其他模拟调用?

我知道这并不代表任何严格的检查,也不能被认为是最佳实践,但是在测试带有大量成员方法的方法时,它将很方便。

1 个答案:

答案 0 :(得分:2)

给出代码:

public void methodUnderTest(){
   request.foo();
   anInstance.bar();
   yetAnotherInstance.baz();
}

一旦调用bar(),就不能跳过baz()foo()的执行。让我也说您不想这样做,因为即使您可以在测试中跳过它,它也将在生产中执行,所以您最好也对其进行测试:-)

您能做的最近的事情是

context.checking(new Expectations() {{
    oneOf(requestMock).foo();
    ignoring(anInstanceMock).bar();
    ignoring(yetAnotherInstanceMock).baz();
}});

我在第一行使用oneOf()是因为foo()是测试的重点。您也可以通过不提及bar()baz()来简化此操作:

context.checking(new Expectations() {{
    oneOf(requestMock).foo();
    ignoring(anInstanceMock);
    ignoring(yetAnotherInstanceMock);
}});

但是请记住,这样做将忽略对anInstanceMockyetAnotherInstanceMock的任何方法调用。