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

模拟方法不返回预期结果

沈思博
2023-03-14

我想mock接受对象参数的方法mockedMethod(Object Object)。此对象参数是从TestedMethod动态创建的。MockedMethod不会返回预期的结果,尽管这两个对象具有相同的数据,但只是不同的哈希代码

public void testedMethod() {
    Object object = initObject(); // this object is initialized dynamically
    Long result = mockedMethod(object);
    ...
}

@Test
public void test() {
    Object object = new Object();
    when(api.mockedMethod(object).thenReturn(3L);
    testedMethod();
}

有没有什么方法来模拟方法,使它能够以预期的结果响应?

共有1个答案

皇甫德庸
2023-03-14

似乎你有两个选择:

您可以使用any()notnull(),正如geoand在注释中提到的那样。它们定义任何参数(any)或任何非空参数(Notnull)的行为。

when(api.mockedMethod(Mockito.any()).thenReturn(3L);
// or
when(api.mockedMethod(Mockito.notNull()).thenReturn(3L);

这些静态方法返回参数匹配器,并且可以在从匹配器对象继承的Mockito对象上找到(以保持API之间的一点点分离)。

如果需要检查对象是否匹配某些自定义条件,可以使用自定义ArgumentMatcher对象。这些对象(也称为Hamcrest匹配器,因为它们直接来自Hamcrest库)只有一个布尔方法,如果对象匹配条件,则返回true。

/** Returns true if the passed object has FooBar anywhere in its class name. */
class HasFooBarInClassName extends ArgumentMatcher<Object> {
  @Override public boolean matches(Object object) {
    return object.getClass().getName().contains("FooBar");
  }
}

when(api.mockedMethod(argThat(new HasFooBarInClassName())).thenReturn(3L);

有时,您的代码需要“捕获”对象以进行额外的验证或处理,这是Mockito无法单独完成的。您可以使用argumentcaptor来帮助您:

ArgumentCaptor<Object> captor = ArgumentCaptor.for(Object.class);
when(api.mockedMethod(any()).thenReturn(3L);
testedMethod();
verify(api).mockedMethod(captor.capture());

// Now you can check the object, as needed, using your own methods.
checkObjectAsNeeded(captor.getValue());
 类似资料:
  • 我有一个类,它有以下实现: 如您所见,方法调用,然后在返回结果之前执行一些逻辑。 当我试图模拟这个存储库进行单元测试时,我很难从中获得结果,因为它总是作为空引用异常而失败。 以下是单元测试: 如何使此测试工作,使模拟方法在调用被模拟的方法之后执行一些逻辑?

  • 我有一个带有两个衰减函数(ES 2.4.4)的查询,我使用对查询项中的衰减函数得分求和。对于测试,我使用来防止任何其他分数(来自查询)影响我的分数(我想测试衰减函数)。 这些是我的衰减函数: 我的结果包括2篇不同日期的文章(2017-08-28,2009-05-08)具有相同的优先级(1000)和相同的分数!(13.122)怎么会这样?为什么没有获得更好的分数?所以我试图解释查询。 对于2017-

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

  • 我调用了一个方法,它连接到另一个服务器,每次调用它,它都返回不同的数据。 我正在为调用该方法的类编写一个单元测试。我已经嘲笑了那个类,我希望它返回存根结果。它实际上使用工作,但是它每次都返回相同的数据。我希望它返回不同的数据,我希望能够指定它应该是什么。 我试着使用“doReturn-when”,它可以工作,但我无法让它返回不同的结果。我不知道怎么做。 我还尝试使用“when-thenReturn

  • 试图找出这个微不足道的例子的分数。我希望得到brenda eaton的文件,但我得到的是brenda fassie的最佳结果。

  • 我有以下命名查询; 当我执行代码时; 我没有得到Person类型的resultList,即使我已经明确指定了命名查询的参数。相反,我得到的类型是包含对象数组的向量。 如何使查询显式返回“Person”类型?