[英]Mocking a class vs. mocking its interface
对于单元测试,我需要模拟几个依赖项。 其中一个依赖项是实现接口的类:
public class DataAccessImpl implements DataAccess {
...
}
我需要设置这个类的模拟对象,当提供一些指定的参数时返回一些指定的值。
现在,我不确定的是,模拟界面或类是否更好,即
DataAccess client = mock(DataAccess.class);
与
DataAccess client = mock(DataAccessImpl.class);
它在测试方面有什么不同吗? 什么是首选方法?
在你的情况下它可能没什么区别,但首选的方法是模拟接口,通常如果你遵循TDD(测试驱动开发),那么你甚至可以在编写实现类之前编写单元测试。 因此,即使您没有具体的类DataAccessImpl
,您仍然可以使用接口DataAccess
编写单元测试。
此外,模拟框架在模拟类中有局限性,而某些框架默认只模拟接口。
这取决于。 如果您的代码依赖于类而不是接口,则必须模拟类以编写有效的单元测试。
在大多数情况下,技术上没有区别,你可以模拟类作为一个接口。 从概念上讲,由于更好的抽象,最好使用接口。
您应该模拟界面,因为它有助于确保您遵守Liskov Substitution Principal( https://stackoverflow.com/a/56904/3571100 )。
如果你只是通过界面使用它并且它不是局部模拟,除了你的内心感觉之外没有区别。 如果类具有它们,模拟该类也将模拟未使用的公共方法,但这不是一个需要考虑的大问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.