对于单元测试,我需要模拟几个依赖项。其中一个依赖项是实现接口的类:
public class DataAccessImpl implements DataAccess {
...
}
我需要设置这个类的模拟对象,当提供一些指定的参数时返回一些指定的值。
现在,我不确定,是否最好嘲笑界面或类,即
DataAccess client = mock(DataAccess.class);
VS。
DataAccess client = mock(DataAccessImpl.class);
在测试方面有什么不同吗?什么是首选方法?
答案 0 :(得分:45)
在您的情况下可能没有太大区别,但首选的方法是模拟界面,通常如果您遵循TDD(测试驱动开发),那么您甚至可以在编写实现类之前编写单元测试。因此,即使您没有具体的类DataAccessImpl
,您仍然可以使用您的接口DataAccess
编写单元测试。
此外,模拟框架在模拟类中有局限性,而某些框架默认只模拟接口。
答案 1 :(得分:6)
这取决于。如果您的代码依赖于类而不是接口,则必须模拟该类以编写有效的单元测试。
答案 2 :(得分:6)
在大多数情况下,技术上没有区别,你可以模拟类作为接口。从概念上讲,由于更好的抽象,最好使用接口。
答案 3 :(得分:3)
你应该嘲笑界面,因为它有助于确保你坚持Liskov Substitution Principal(https://stackoverflow.com/a/56904/3571100)。
答案 4 :(得分:2)
如果你只是通过界面使用它并且它不是局部模拟,除了你的内心感觉之外没有区别。如果类具有它们,模拟该类也将模拟未使用的公共方法,但这不是一个需要考虑的大问题。