首页 > 解决方案 > 如何使用模拟简化我的单元测试

问题描述

我的单元测试面临一个真正的问题。我目前正在从事一个已有 2 年历史的项目,并且我已经编写了 2 个月的单元测试。由于代码的复杂性,大部分需要测试的函数都调用了 5 到 15 个其他函数,并且在每个函数中,使用了大约 5 个对象和 10 个参数。一开始,我只是用 Junit 和 EasyMock 测试简单的基本函数,但现在我正在使用这种复杂的函数,为每个测试用例设置 mock 及其行为大约需要 300 行,这对于我。

你们有任何替代解决方案来解决这个问题吗?

标签: javaunit-testingjunitmocking

解决方案


首先,区分哪些依赖项真正困扰您。请参阅https://stackoverflow.com/a/60196328/5747415以获取使依赖项变得麻烦的标准列表。那些不麻烦的依赖不需要mock。

其次,如果有可能,请尝试重新设计代码:将计算主导代码(没有麻烦依赖的代码)与交互主导代码(主要处理调用其他代码的代码)分开。现在看看你可以完美实现这种分离的代码部分:在这些代码部分中,使用单元测试来测试代码(可能还有非麻烦的依赖关系)——显然这里不需要模拟。仅包含您将通过集成测试进行测试的交互的代码,同样无需模拟。

第三,可能还会存在难以完美分离的代码部分,而您的计算与交互混合在一起。在这里,您可能必须使用双打进行单元测试。对于这些情况,还有一些重新设计策略可以减少模拟工作。例如,在辅助方法中集中访问某些依赖项(例如,执行获取、验证和解压缩某些数据的工作的辅助方法):在这样的重新设计之后,不必模拟多个依赖项(相同的示例:到数据库、认证库、压缩库)你只需要模拟你的辅助函数。

这种策略可以为您节省大量创建双打的努力。


推荐阅读