另一种选择是依靠良好的旧时尚equals
方法。只要when
模拟中equals
的参数是要测试的代码中的参数,则Mockito将匹配该模拟。
这是一个例子。
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
初级开发人员编写的代码,因为它浏览了他们代码的逻辑以生成适当的传递对象。
缺点:有时传递给对象的字段是随机ID。对于这种情况,您不能轻松地在模拟代码中构造预期的参数对象。
另一种可能的方法是使用Answer
可与该when
方法一起使用的Mockito 对象。 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
检查的说法。