单元测试时如何避免过度使用接口

时间:2018-02-25 04:42:00

标签: unit-testing dependency-injection

为了使我的代码对单元测试更友好,使用dependnency注入似乎是明智的。这要求任何依赖类必须使用完全相同的方法集实现接口。

我也看到建议说我不应该为每个班级都有一个界面,但我不知道我怎么可能遵循这两条建议。如果我想进行单元测试,每个有用的类都必须遵循一个接口。

证明:假设存在一个没有实现任何接口的类。如果我能够对整个程序进行单元测试,那么其他任何代码都不依赖于此类。因此,这个类是无用的,也可能被删除。

我有什么误解吗?有没有办法进行单元测试而不将我的所有类复制/粘贴到等效结构化的接口中?

3 个答案:

答案 0 :(得分:1)

为了编写有效的测试,您需要在代码中使用接缝(这个区域可以让您将依赖项分开),以允许您控制代码中的任何依赖项。接口可能是最明显的方法,但您可以使用其他技术,例如将依赖项包装在测试类中的方法中,并将该方法声明为受保护的虚拟(c#)并覆盖单元测试的类。 YouTube上有很多关于TDD的视频,用于处理TDD时的设计决策。搜索"是TDD死了"。

答案 1 :(得分:0)

在单元测试时,您通常只想模拟进行外部调用的类(无论是数据库查询还是命中API)。因此,您需要为这些类提供接口。但是,很多时候你可能会使用随机的DTO或实用程序类来做一些简单的小事而不需要被嘲笑。

答案 2 :(得分:0)

有些语言的工具可以让你在不编写相应接口的情况下模拟类;例如,Python允许patching arbitrary classes in test code,而Mockito Java库可以从任何类生成模拟对象。

有一种思想流派在编写单元测试时说,只有“叶子”,即不调用应用程序中其他类的类和方法,应该单独进行单元测试,以及涉及的类编排其他类的行为应该在接受或集成级别进行测试。这种测试方式避免了编写依赖于模拟应用程序中大多数类的单元测试,因此避免了编写接口的需要。 Martin Fowler的article on mocks涵盖了关于模拟的不同测试方式之间的一些差异。