模拟方法不会返回预期结果

时间:2014-05-31 13:30:48

标签: java unit-testing mocking mockito

我想模拟接受Object param的方法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();
}

有没有办法如何模拟方法,它会以预期的结果作出回应?

2 个答案:

答案 0 :(得分:2)

好像你有两个选择:

接受任何

您可以使用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库)只有一个布尔方法,如果对象与条件匹配,则返回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);

奖励:捕获对象

有时您的代码需要&#34;捕获&#34;以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());

答案 1 :(得分:1)

当然不是“预期”;你将一个完全不同的对象传递给when子句,并且该方法使用自己的initObject()。您应该将object注入正在测试的类中,或者mockedMethod属于服务接口,并且您应该模拟那个