Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用Mockito模拟方法调用_Java_Unit Testing_Mockito - Fatal编程技术网

Java 如何用Mockito模拟方法调用

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)之类的操作 谢谢你的帮助 模拟方法调用的目的是在模拟实例上调用方法时立即返回值(或引发异常)。它允许您在

我正在尝试为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
功能发布答案,我会稍后再发布。我知道你不应该这样做。但是我没有编写程序,我只需要为它编写测试。据我所知,有一些问题导致了这种交流方式。