想象一下,我们有一个类,其中构造函数内部执行了许多逻辑。
问题:如何在执行构造函数之前在该类中注入模拟?
附加信息:
这个课程不是我写的,我不想通过可检验的原因改变其结构来违反此类的现有界面。值得一提的是,它是一个ViewModel的类实例,并且在其实例化上,它使用此ViewModel的字段在RXJAVA2 Flow中运行身份验证检查以获取所需的可观察到。
因此,它甚至在@injectsmocks注释进来之前就抛出NullPoInterException。如果我尝试不尝试在测试类ViewModel的字段声明中实例化ViewModel,则由于" MockitoException"而失败,这是由于尝试使用Mockito本身而引起的。实例化一个意图在此之后注入模拟的对象,但是构造函数已经失败了。
因此,甚至可以解决此问题而不会违反"不要更改测试"规则?
唯一的真实在这里回答:您将时间和精力投入错误的地方。
您看到:
我们有一个类,其中构造函数内部执行了许多逻辑
是抗模式。一次:因为它使您的班级如此艰难。您完全陷入这种情况:有意义的解决您的依赖项几乎是不可能的。如果您发现代码难以测试,那么这通常是不良设计的直接结果。因此,对您的代码进行重构不仅可以使其可测试,还可以显着提高其质量!
但是您的"解决方案"是将模拟框架魔术用作创可贴。但这是错误的方法:因为您仍然无法轻易实例化"正在测试的对象"。随着时间的流逝,这个问题将在其他各种症状中表现出来。
从某种意义上说:学习如何编写可测试代码 - 例如观看这些视频。
如果您真的想要/必须像它一样保留该课程 - 那么请考虑使用依赖项注入框架(例如Guice(。