Java 如何用Mockito模拟方法调用
我正在尝试为MAS编写单元测试。因此,我必须模拟代理与之通信的代理。下面是我目前正在尝试做的一个例子。我有一个我想测试的代理A。他在另一个代理B上调用B.method(arg),在我的例子中这是模拟的。通常B会调用A.method(arg1、arg2、arg3)。我对Mockito是新手,对它的可能性不太了解。是否可以执行诸如when(mock.method).然后call(A.method)之类的操作Java 如何用Mockito模拟方法调用,java,unit-testing,mockito,Java,Unit Testing,Mockito,我正在尝试为MAS编写单元测试。因此,我必须模拟代理与之通信的代理。下面是我目前正在尝试做的一个例子。我有一个我想测试的代理A。他在另一个代理B上调用B.method(arg),在我的例子中这是模拟的。通常B会调用A.method(arg1、arg2、arg3)。我对Mockito是新手,对它的可能性不太了解。是否可以执行诸如when(mock.method).然后call(A.method)之类的操作 谢谢你的帮助 模拟方法调用的目的是在模拟实例上调用方法时立即返回值(或引发异常)。它允许您在
谢谢你的帮助 模拟方法调用的目的是在模拟实例上调用方法时立即返回值(或引发异常)。它允许您在不调用被测类的协作者的情况下运行该类 因此,与其将方法调用委托给另一个方法调用,您通常只需
thenResult(someValue)
或thenThrow(someException)
可能您的测试依赖于助手方法来派生
someValue
,但这不太可能是一个有用的测试。您不应该这样做,强制B
调用a
是一个糟糕的设计(这样做很好,但强制执行是错误的),B
调用A
的事实应该在B
的单元测试中测试,而不是在A
中测试,并且A
应该不知道这一点
另一方面,您可以使用Mockito验证调用了B.method()
(以及调用了多少次,使用了哪个参数),或者从B.method()
返回存根值,而不调用a
,这是一个很好的统一测试,因为它检查a
的单个行为。(对A.method()
的调用应单独测试)
例如,使用Mockito返回存根值很容易
Mockito.when(mockedB.method(SOME_ARG_HERE)).thenReturn(SOME_RESULT);
更多有用的例子和信息可以在晚会上稍晚一点的地方找到,但我相信只要有答案就可以实现你的愿望 无论何时调用mock方法(methodOnB),以下内容都将调用实方法(methodOnA):
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
realObjectA.methodOnA()
return null;
}
}).when(mockObjectB).methodOnB();
doAnswer(新答案(){
@凌驾
公共Void应答(invocationmock invocationmock)抛出可丢弃的{
realObjectA.methodOnA()
返回null;
}
}).when(mockObjectB.methodOnB();
您似乎并不清楚要测试什么。你的意思是检查当你调用B时,A实际上也被调用了吗?你不应该这样做,强制执行B
调用A
(这样做很好,但强制执行是错误的),B
调用A
的事实应该在B
的单元测试中测试,不是A
。使用Mockito的Answer
功能,这当然是可能的。检查文档。然而,两个类之间的这种循环依赖几乎可以肯定地表明设计很差。我建议你重新思考这些课程之间的关系。如果没有其他人使用answer
功能发布答案,我会稍后再发布。我知道你不应该这样做。但是我没有编写程序,我只需要为它编写测试。据我所知,有一些问题导致了这种交流方式。