Mockito。调用相同的模拟方法时如何返回不同的结果?

时间:2019-06-05 12:19:41

标签: java unit-testing mockito

我有一个调用方法,该方法连接到另一台服务器,并且每次调用它时,它都会返回不同的数据。 我正在为调用该方法的类编写单元测试,并且已经对该类进行了模拟,并且正在调用该方法,并且我希望它返回存根的结果。它实际上使用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

4 个答案:

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

感谢大家的帮助! /一月