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

hel*_*hod 43 java junit unit-testing mocking

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

public class DataAccessImpl implements DataAccess {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

现在,我不确定的是,模拟界面或类是否更好,即

DataAccess client = mock(DataAccess.class);
Run Code Online (Sandbox Code Playgroud)

DataAccess client = mock(DataAccessImpl.class);
Run Code Online (Sandbox Code Playgroud)

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

Kul*_*ain 49

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

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


ono*_*nof 6

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

  • 或者听取测试并使代码依赖于接口,因为它可能应该. (15认同)

Ale*_*kov 6

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


jor*_*dan 6

您应该模拟界面,因为它有助于确保您遵守 Liskov 替换原则 ( /sf/answers/3983311/ )。