Mocking a class vs. mocking its interface
对于单元测试,我需要模拟几个依赖项。依赖项之一是实现接口的类:
1 2 3 | public class DataAccessImpl implements DataAccess { ... } |
我需要设置一个这个类的模拟对象,当提供一些指定的参数时,它返回一些指定的值。
现在,我不确定的是,是否更好地模拟接口或类,也就是说。
1 | DataAccess client = mock(DataAccess.class); |
VS
1 | DataAccess client = mock(DataAccessImpl.class); |
在测试方面有什么不同吗?首选的方法是什么?
在您的情况下,这可能不会有太大的区别,但是首选的方法是模拟接口,正如通常情况下,如果您遵循TDD(测试驱动开发),那么即使在编写实现类之前也可以编写单元测试。因此,即使没有具体的类
此外,模拟框架在模拟类方面有局限性,一些框架在默认情况下只模拟接口。
在大多数情况下,技术上没有区别,您可以模拟为类,因此是一个接口。从概念上讲,由于更好的抽象,使用接口更好。
这要看情况而定。如果代码依赖于类而不是接口,则必须模拟类来编写有效的单元测试。
您应该模拟该接口,因为它将有助于确保您遵守Liskov替换原则(https://stackoverflow.com/a/56904/3571100)。
如果你只通过界面来使用它,而且它不是一个局部的模仿,除了你的内在感觉之外,没有什么不同。嘲笑类也会模拟非使用的公共方法,如果类有他们,但这不是一个大问题要考虑。