我想模拟接受对象参数的方法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/