Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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/2/linux/25.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 调用同一模拟方法时如何返回不同的结果?_Java_Unit Testing_Mockito - Fatal编程技术网

Java 调用同一模拟方法时如何返回不同的结果?

Java 调用同一模拟方法时如何返回不同的结果?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我调用了一个方法,该方法连接到另一台服务器,每次调用时,它都返回不同的数据。 我正在为调用该方法的类编写一个单元测试。我已经模拟了那个类,我希望它返回存根结果。它实际上使用doReturn工作,但每次都返回相同的数据。我希望它返回不同的数据,并且我希望能够指定它应该是什么 我试着使用“doReturn-when”,它可以工作,但我不能让它返回不同的结果。我不知道怎么做 我还尝试使用“when-thenReturn”,这是我在StackOverflow上找到的解决方案。有了它,我可以指定每次调用同

我调用了一个方法,该方法连接到另一台服务器,每次调用时,它都返回不同的数据。
我正在为调用该方法的类编写一个单元测试。我已经模拟了那个类,我希望它返回存根结果。它实际上使用
doReturn
工作,但每次都返回相同的数据。我希望它返回不同的数据,并且我希望能够指定它应该是什么

我试着使用“doReturn-when”,它可以工作,但我不能让它返回不同的结果。我不知道怎么做

我还尝试使用“when-thenReturn”,这是我在StackOverflow上找到的解决方案。有了它,我可以指定每次调用同一个方法时得到不同的响应

问题是我得到了一个编译错误

对于类型
ongoingstubing

JSONArray-jsonArray1={json-array1 here};
JSONArray jsonArray2={json array2 here};
//工作,但每次返回相同的jsonArray1:
MyClass MyClassMock=mock(MyClass.class);
Mockito.doReturn(jsonArray1)
.when(MyClassMock).getMyValues(any(List.class)、any(String.class)、any(String.class),
任何(String.class),
任何(String.class));
//不起作用:
when(MyClassMock).getMyValues(any(List.class)),
any(String.class),any(String.class),
任何(String.class),
any(String.class)),然后返回(jsonArray1,jsonArray2);
//编译错误:
//对于类型OnGoingStubing,未定义getMyValues(any(List.class)、any(String.class)、any(String.class)、any(String.class))方法
我发现编译错误:

方法getMyValues(any(List.class)、any(String.class), any(String.class)、any(String.class)、any(String.class))未定义 对于OngoingStubing类型


当出现以下情况时,请确保将模拟及其方法放入
中:

when(MyClassMock.getMyValues(any(List.class),
           any(String.class), any(String.class),
           any(String.class),
           any(String.class))
    .thenReturn(jsonArray1)
    .thenReturn(jsonArray2);

首先,您需要在以下情况下将模拟方法放入

when(MyClassMock.getMyValues(any(List.class),
       any(String.class), any(String.class),
       any(String.class),
       any(String.class)).thenReturn(...);
此外,如果您希望更多地控制返回的内容(例如,根据方法的输入参数),则应使用,而不仅仅是返回值

因此,我认为这是一个更好的解决方案:

when(MyClassMock.getMyValues(any(List.class),
       any(String.class), any(String.class),
       any(String.class),
       any(String.class)).thenAnswer(new Answer<JSONArray> {/*Add implementation here*/});
when(MyClassMock.getMyValues)(any(List.class)),
any(String.class),any(String.class),
任何(String.class),
any(String.class)).thenAnswer(新答案{/*在此处添加实现*/});

也许可以帮助您使用Mockito的答案类。

对于普通的模拟,您可以使用如下内容:

when(mockFoo.someMethod())
            .thenReturn(obj1, obj2)
            .thenThrow(new RuntimeException("Fail"));
如果使用的是spy()和doReturn()而不是when()方法:

在不同的调用中,您需要返回不同的对象:

doReturn(obj1).doReturn(obj2).when(this.client).someMethod();

最后的建议奏效了

doReturn(obj1).doReturn(obj2).when(this.client).someMethod()

谢谢大家的帮助!
/Jan

您好,感谢大家提供的所有答案。我按照您的建议进行了更改,但我现在收到一个错误,在.thenReturn语句上显示“类型JSONArray的方法thenReturn(JSONArray)未定义”。我没有尝试使用“new Answer”的解决方案因为我需要先学习如何使用Answer。此外,我没有任何实现。我只想返回一个JSON对象。向您致意/Jan这听起来像是编译器期望的返回类型与方法getMyValues(…)不同。您在这里使用的是正确的返回类型吗?
doReturn(obj1).doReturn(obj2).when(this.client).someMethod();