繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM