如何使用Mockito模拟方法调用

时间:2014-11-20 09:51:10

标签: java unit-testing mockito

我正在尝试为MAS编写Unittests。因此,我必须模拟代理与之通信的代理。这是我目前正在尝试做的一个例子。我有一个代理A,这是我想测试的。他把B.method(arg)称为另一个代理B,在我的案例中被嘲笑。通常B会调用A.method(arg1,arg2,arg3)。我是Mockito的新手,并不了解它的可能性。是否有可能做什么时候(mock.method).thenCall(A.method)?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

参加派对有点晚了,但我相信能用答案实现你想要的目标。

每当调用mock方法(methodOnB)时,以下将调用实际方法(methodOnA):

doAnswer(new Answer<Void>() {
    @Override
    public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
        realObjectA.methodOnA()
        return null;
    }
}).when(mockObjectB).methodOnB();

答案 1 :(得分:0)

模拟方法调用的目的是在模拟实例上调用方法时立即返回值(或抛出异常)。它允许您在不调用该课程的情况下练习被测试课程。合作者。

因此,不是将方法调用委托给另一个方法调用,而是通常只需thenResult(someValue)thenThrow(someException)

您的测试可能依赖于辅助方法来派生someValue,但这不太可能是有用的测试。

答案 2 :(得分:0)

你不应该这样做,ENFORCE B调用A是一个糟糕的设计(这样做很好,但执行它是错误的),事实B正在调用A的{​​{1}}应该在B的联合国内进行测试,而不是A,而A应该不知道它的。

另一方面,您可以通过Mockito验证调用B.method()(以及使用了多少次,以及使用哪个参数),或者在不调用{{1}的情况下从B.method()返回存根值这是一个很好的unitest - 因为它检查A的单个行为。 (对A的调用应单独测试。)

例如,使用

可以轻松地使用Mockito返回存根值
A.method()

可以在Mockito's javadocs

找到更多有用的示例和信息