我正在尝试为MAS编写Unittests。因此,我必须模拟代理与之通信的代理。这是我目前正在尝试做的一个例子。我有一个代理A,这是我想测试的。他把B.method(arg)称为另一个代理B,在我的案例中被嘲笑。通常B会调用A.method(arg1,arg2,arg3)。我是Mockito的新手,并不了解它的可能性。是否有可能做什么时候(mock.method).thenCall(A.method)?
感谢您的帮助!
答案 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()
找到更多有用的示例和信息