我有一个关于如何测试彼此之间具有依赖关系的2个类的问题,但不能一起进行单元测试。我无法创建一个足够短的代码示例,所以我将尝试用假设的类来解释它。对不起,如果这太混乱了,但我仍然试图想出一个简洁的例子。
在这个例子中,我们关注4个不同的类:ObjectCreator,ObjectUser1,ObjectUser2和Object。在ObjectUser1和ObjectUser2的单元测试中,每个都显式构造要使用的Object实例。 ObjectCreator还具有单元测试,以确保对象实例的“正确”构造。所有单元测试都成功通过。现在,找到了ObjectUser1中的一个错误,该错误未在单元测试中公开。此错误是由于ObjectCreator如何创建对象与ObjectUser1如何使用它之间不兼容。 ObjectUser2中不存在此错误。修复bug的方法是改变ObjectCreator构造对象的方式。我面临的问题是,当我更改ObjectCreator时,所有单元测试再次通过,但我知道新的更改已经破坏了ObjectUser2(由于Object为单元测试构建的方式,单元测试为ObjectUser2传递)。假设出于复杂性原因,我不想在ObjectUser1和ObjectUser2的单元测试中使用ObjectCreator。
这是单元测试中的常见问题吗?如果不能一起进行单元测试,那么测试依赖关系的最佳方法是什么?任何有关这方面的帮助将不胜感激。
答案 0 :(得分:2)
测试B类时,Mock A. 所以你将得到你想要的结果A.但是B仍然会依赖它。
您可以根据需要进行单元测试。你保持了你的依赖。
答案 1 :(得分:1)
答案 2 :(得分:1)
看起来你没有从应用程序逻辑中充分拆分依赖逻辑,因为对象A创建了对象B.你想要将其删除所以A有一个引用到某种创建对象B的提供者。
我将采用的路由是使用Dependency Injection将依赖关系构造逻辑与应用程序逻辑分开。但是,切换到DI框架可能是您项目的一项重大任务。您可以使用其他选项,包括一个简单的静态factory method,只要您在方法中添加钩子以强制它返回您需要返回的内容。
一旦两者分离,就是模拟对象B的一个简单例子。
答案 3 :(得分:0)
听起来我觉得你的物体太紧密耦合了,而且可能会被分开。你是否可以以一种难以解耦的方式重用Object,并且可能需要两个独立的对象?