我有一个调用方法,该方法连接到另一台服务器,并且每次调用它时,它都会返回不同的数据。 我正在为调用该方法的类编写单元测试,并且已经对该类进行了模拟,并且正在调用该方法,并且我希望它返回存根的结果。它实际上使用doReturn起作用,但是每次都返回相同的数据。我希望它返回不同的数据,并且希望能够指定它应该是什么。
我尝试使用doReturn-何时和它都可以工作,但我无法使其返回不同的结果。我不知道该怎么做。
我尝试使用when-thenReturn这是我在StackOverflow上找到的解决方案。这样,我可以指定每次调用相同方法时得到的响应都不同。
问题是我收到一个编译错误“对于类型OngoingStubbing,未定义方法XXX
不用说,我对Mockito不太满意,我也不是很清楚问题所在。
JSONArray jsonArray1 = { json array1 here };
JSONArray jsonArray2 = { json array2 here };
// Works but return the same jsonArray1 every time:
MyClass MyClassMock = mock(MyClass.class);
Mockito.doReturn(jsonArray1)
.when(MyClassMock).getMyValues(any(List.class), any (String.class), any(String.class),
any(String.class),
any(String.class));
// Does not work:
when(MyClassMock).getMyValues(any(List.class),
any(String.class), any(String.class),
any(String.class),
any(String.class)).thenReturn(jsonArray1, jsonArray2);
// Compile error:
// The method getMyValues(any(List.class), any(String.class), any (String.class), any(String.class), any(String.class)) is undefined for the type OngoingStubbing<MyClass>
我得到编译错误:
getMyValues(any(List.class),any(String.class), any(String.class),any(String.class),any(String.class))未定义 类型为OngoingStubbing
答案 0 :(得分:1)
确保将模拟及其方法放入when
中:
when(MyClassMock.getMyValues(any(List.class),
any(String.class), any(String.class),
any(String.class),
any(String.class))
.thenReturn(jsonArray1)
.thenReturn(jsonArray2);
答案 1 :(得分:1)
首先,您需要将模拟方法放在when内:
when(MyClassMock.getMyValues(any(List.class),
any(String.class), any(String.class),
any(String.class),
any(String.class)).thenReturn(...);
此外,如果您想更好地控制返回的内容(例如,根据方法的输入参数,则应使用Answer而不是仅仅返回值。
所以我认为这将是更好的解决方案:
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*/});
也许this post可以帮助使用Mockito的Answer类。
答案 2 :(得分:0)
对于普通的模拟游戏,您可以使用类似以下的内容:
when(mockFoo.someMethod())
.thenReturn(obj1, obj2)
.thenThrow(new RuntimeException("Fail"));
如果您使用的是spy()和doReturn()而不是when()方法:
您需要在不同的调用上返回不同的对象是这样的:
doReturn(obj1).doReturn(obj2).when(this.client).someMethod();
答案 3 :(得分:0)
最后一条建议奏效了!
Mockito.doReturn(obj1).doReturn(obj2).when(this.client).someMethod();
感谢大家的帮助! /一月