java模拟使用接口,关于java:模拟一个类与模拟它的接口

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

public class DataAccessImpl implements DataAccess {

...

}

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

现在,我不确定的是,是否更好地模拟接口或类,也就是说。

DataAccess client = mock(DataAccess.class);

VS

DataAccess client = mock(DataAccessImpl.class);

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

下面是一些关于模拟课的其他想法。读得不错,imho:stackoverflow.com/questions/1595166/…

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

此外,模拟框架在模拟类方面有局限性,一些框架在默认情况下只模拟接口。

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

这要看情况而定。如果代码依赖于类而不是接口,则必须模拟类来编写有效的单元测试。

或者听测试,让代码依赖于一个接口,这很可能是应该的。

这是错误的。如果你看到不同,请解释一下。TDD甚至要求对接口进行测试,而不是对实现的类进行测试。如果您的代码依赖于一个类而不是给定的接口,那么您还有另一个更大的问题。

您应该模拟该接口,因为它将有助于确保您遵守Liskov替换原则(https://stackoverflow.com/a/56904/3571100)。

很有趣的是,您如何通过模拟接口来实现这一点?我可以模拟接口,但在类实现中,我可以违反Liskov替换。

@karlihnos我提供的链接声明"函数[…]必须能够在不知道的情况下使用派生类的对象。"换句话说,我们应该编程到接口,而不是实现。所以在测试的类中,我们可以通过编程到接口来帮助实现LSP。当然,这样做并不能说明任何模拟接口实现是否会遵循LSP。

如果你只通过界面来使用它,而且它不是一个局部的模仿,除了你的内在感觉之外,没有什么不同。嘲笑类也会模拟非使用的公共方法,如果类有他们,但这不是一个大问题要考虑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值