我有一个允许方法链接的db服务save()方法:
@Service
public class Service {
...
public Service save(...) {
...
return this;
}
这个效果很好:
service.save(this).save(that).save(other);
当我用Mockito来模拟它的时候,它会中断,除非我使用
Service serviceMock = mock(Service.class, RETURNS_DEEP_STUBS);
但是,使用returns_deep_stub被认为是不好的。有没有更好的方法来模拟一个类的方法调用链?
您的save
模式非常类似于Builder模式,这使得问题类似于SO的其他地方的"如何使用mockito模拟构建器"。
根据David Wallace的回答,您可以编写一个Answer
来检测mock是否是方法返回类型的实例,并仅在这种情况下返回mock。在Mockito 2.0中,这个功能也作为RETURNS_SELF
被内置到Mockito库中。与任何答案一样,您可以在thenAnswer
的任何特定方法调用上使用它,或者将其作为mock
的第二个参数使其成为默认答案,但请记住Mockito文档警告,具有慷慨返回类型的方法(例如Object
)将返回模拟,无论是否有意。