java - 模拟方法未返回预期结果

标签 java unit-testing mocking mockito

我想模拟接受对象参数的方法mockedMethod(Object object)。该对象参数是从 testedMethod 动态创建的。尽管两个对象具有相同的数据,但只有不同的 hashCode,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();
}

有什么方法可以模拟方法,使其响应预期结果吗?

最佳答案

似乎您有两个选择:

接受任何内容

您可以使用any()notNull(),如geoand评论中提到。它们定义任何参数 (any) 或任何非空参数 (notNull) 的行为。

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

这些静态方法返回 argument matchers ,并且可以在 Mockito object 上找到继承自 Matchers object (以使 API 稍微分开)。

编写您自己的自定义匹配器

如果您需要检查对象是否匹配某些自定义条件,您可以使用自定义 ArgumentMatcher 对象。这些对象(也称为 Hamcrest 匹配器,因为它们直接来自 Hamcrest 库)只有一个 boolean 方法,如果对象匹配条件,则返回 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());

关于java - 模拟方法未返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970619/

相关文章:

unit-testing - 第 3 方库测试 angular 2 webpack

python - 在 Python 中模拟远程主机

java - 当我尝试包含对模拟对象的期望时,此 SecurityException 的原因是什么?

ruby - 如何在 Ruby 中使用 Mocha 测试工厂模式?

java - 无法在 Eclipse 中创建 .dslr

java - 读取文件时无限循环

java - Mockito - 内部方法调用

python - 使用 unittest 和 argparse 测试参数解析

java - JTable 问题中的数字排序

java - kgefec : fatal error 0 kgepop: no error frame to pop to for error 21503 on tomcat startup