如何使用 Mockito 模拟方法调用



我正在尝试为 MAS 编写单元测试。因此,我必须模拟代理正在与之通信的代理。这是我目前尝试做的一个例子。我有一个代理 A,它是我要测试的代理。他在另一个代理B上调用B.method(arg),这在我的案例中被嘲笑。通常 B 会调用 A.method(arg1, arg2, arg3)。我是Mockito的新手,对它的可能性知之甚少。是否可以做类似when(mock.method).thenCall(A.method)的事情?

感谢您的帮助!

派对有点晚了,但我相信能够通过答案实现您想要的。

每当调用模拟方法(

methodOnB)时,下面将调用一个真正的方法(methodOnA):

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

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

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

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

你不应该这样做,强制执行B调用A是一个糟糕的设计(这样做很好,但强制执行是错误的),B正在调用A的事实应该在B的 unitests 中进行测试,而不是A的,A应该不知道它。

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

例如,使用 Mockito 返回存根值很容易完成

Mockito.when(mockedB.method(SOME_ARG_HERE)).thenReturn(SOME_RESULT);

更多有用的示例和信息可以在Mockito的javadocs中找到

相关内容

  • 没有找到相关文章

最新更新