另一种选择是依靠老式的equals 方法。只要whenmock中的参数equals被测试代码中的参数,那么Mockito就会匹配mock。
这是一个例子。
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
那么,假设您知道someField 的值是什么,您可以像这样模拟它。
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
优点:这比 any 匹配器更明确。作为一名代码审查者,我会留意初级开发人员编写的代码中的any,因为它会浏览他们的代码逻辑以生成正在传递的适当对象。
con:有时传递给对象的字段是随机 ID。对于这种情况,您不能轻易地在模拟代码中构造预期的参数对象。
另一种可能的方法是使用 Mockito 的 Answer 对象,该对象可与 when 方法一起使用。 Answer 允许您拦截实际调用并检查输入参数并返回一个模拟对象。在下面的示例中,我使用any 来捕获对被模拟方法的任何请求。但是然后在Answer lambda 中,我可以进一步检查 Bazo 参数......也许是为了验证是否将正确的 ID 传递给它。我更喜欢这个而不是 any 本身,以便至少对参数进行一些检查。
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
总而言之,我喜欢依赖equals(预期参数和实际参数应该彼此相等)和如果相等是不可能的(由于无法预测实际参数的状态),我将求助于Answer 来检查参数。