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();