嘲笑一个类与嘲弄它的界面

时间:2012-02-10 10:30:57

标签: java unit-testing junit mocking

对于单元测试,我需要模拟几个依赖项。其中一个依赖项是实现接口的类:

public class DataAccessImpl implements DataAccess {
    ...
}

我需要设置这个类的模拟对象,当提供一些指定的参数时返回一些指定的值。

现在,我不确定,是否最好嘲笑界面或类,即

DataAccess client = mock(DataAccess.class);

VS。

DataAccess client = mock(DataAccessImpl.class);

在测试方面有什么不同吗?什么是首选方法?

5 个答案:

答案 0 :(得分:45)

在您的情况下可能没有太大区别,但首选的方法是模拟界面,通常如果您遵循TDD(测试驱动开发),那么您甚至可以在编写实现类之前编写单元测试。因此,即使您没有具体的类DataAccessImpl,您仍然可以使用您的接口DataAccess编写单元测试。

此外,模拟框架在模拟类中有局限性,而某些框架默认只模拟接口。

答案 1 :(得分:6)

这取决于。如果您的代码依赖于类而不是接口,则必须模拟该类以编写有效的单元测试。

答案 2 :(得分:6)

在大多数情况下,技术上没有区别,你可以模拟类作为接口。从概念上讲,由于更好的抽象,最好使用接口。

答案 3 :(得分:3)

你应该嘲笑界面,因为它有助于确保你坚持Liskov Substitution Principal(https://stackoverflow.com/a/56904/3571100)。

答案 4 :(得分:2)

如果你只是通过界面使用它并且它不是局部模拟,除了你的内心感觉之外没有区别。如果类具有它们,模拟该类也将模拟未使用的公共方法,但这不是一个需要考虑的大问题。