为什么建议在使用Mockito框架进行单元测试时使用接口?在单元测试中使用接口究竟是什么?
答案 0 :(得分:0)
有两个原因:一个是理论上的,一个是实用的。
使用模拟时,您正在提供应用程序中其他位置存在(或将存在)的组件的测试双;在存根时,你正在模拟真实实现所具有的响应,以及在验证你是否正在对类的外部接口这样做时。这使得明确定义接口应该应该做什么以及 应该行为的成功实现者,无论当前实现如何,都是非常重要的:你是提供不同的实现。
虽然您可以在具体类本身上记录您的实现的合同方法,但是另一种记录和形式化组件的一般合同的方法是提取接口。虽然我不支持未来的工作(参见YAGNI),但如果你要用另一个实现部分或全部替换当前的具体实现,那么这样做也会更清楚 - 此时你将有三个实现接口包括mock,并且可能想要纯粹针对接口编写测试并分别传递每个实现以进行验证/验证。
在内部,Mockito通过生成您尝试测试的类的子类来动态创建测试对象。这意味着你的mock只能覆盖普通子类可以覆盖的行为,这会使Mockito不适合私有类,封装的嵌套或内部类以及最终类。此外,出于类似的原因,您将发现自己无法模拟静态方法,最终方法以及一些私有或受保护的方法(特别是编译器生成synthetic methods的任何位置)。由于Mockito的语法和动态特性,Java无法在编译时警告或强制执行这些规则,并且Mockito无法始终在运行时检测违规。
但是,当模拟接口而不是具体实现时,Mockito可以避免这些麻烦。接口没有内部方法可见性限制或最终方法,类型本身必须是公共的和非最终的。因此,从实用的角度来看,接口带来的简单性和易用性都有优势,但不是具体的类。