我想模拟接受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();
}
有没有办法如何模拟方法,它会以预期的结果作出回应?
答案 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
属于服务接口,并且您应该模拟那个。