我正在尝试为 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中找到