当前位置: 首页 > 知识库问答 >
问题:

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

锺伟志
2023-03-14

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

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

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

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

方法XXX是未定义的类型

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>

我得到编译错误:

方法getMyValue(any(List.class), any(String.class), any(String.class), any(String.class), any(String.class))是未定义的


共有3个答案

彭鸿文
2023-03-14

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

when(mockFoo.someMethod())
            .thenReturn(obj1, obj2)
            .thenThrow(new RuntimeException("Fail"));

如果您使用的是spy()和doReturn()而不是when()方法:

您需要在不同的调用中返回不同的对象是这样的:

doReturn(obj1).doReturn(obj2).when(this.client).someMethod();
皇甫伟彦
2023-03-14

首先,您需要将mocked方法放在time中:

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*/});

也许这篇文章可以帮助使用Mockito的答案类。

栾越
2023-03-14

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

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

 类似资料:
  • 问题内容: 我正在运行以下MySQL查询,以查找没有手册(且车轮有黑轮等)的汽车 查询的结果看起来正确,但是它两次返回ID为27的汽车。如何更改查询,以使所有结果都是唯一的(没有重复项)? 问题答案: 假定这是唯一的主键,那么其中的一种联接将导致笛卡尔乘积。也就是说:或包含多个匹配项。 子查询通常是消除笛卡尔积的好工具。下面的示例查询显示了两种使用子查询的方法。 第一个子查询可确保我们只查看在20

  • 我有一个类,它有以下实现: 如您所见,方法调用,然后在返回结果之前执行一些逻辑。 当我试图模拟这个存储库进行单元测试时,我很难从中获得结果,因为它总是作为空引用异常而失败。 以下是单元测试: 如何使此测试工作,使模拟方法在调用被模拟的方法之后执行一些逻辑?

  • 我想mock接受对象参数的方法。此对象参数是从动态创建的。不会返回预期的结果,尽管这两个对象具有相同的数据,但只是不同的哈希代码。 有没有什么方法来模拟方法,使它能够以预期的结果响应?

  • 如何模拟返回已强制转换的模拟对象的方法。 试验方法。

  • 问题内容: 因此,我正在像这样在类级别上将模拟对象创建为静态变量…在一个测试中,我想返回某个值,而在另一个测试中,我希望它返回一个不同的值。我遇到的问题是,似乎我需要重建模拟才能使其正常工作。我想避免重建模拟,只在每个测试中使用相同的对象。 在第二个测试中,当调用testObj.bar()时,我仍然收到0作为值。解决此问题的最佳方法是什么?请注意,我知道我可以在每个测试中使用不同的模拟,但是,我必

  • 我有一些测试方法: 当我尝试运行此方法时,出现了异常: 我怎么能嘲弄这种方法呢?