在构造函数的逻辑出现之前,将mocks注入类中

时间:2018-02-22 17:33:41

标签: java android testing mocking mockito

想象一下,我们有一个类,在构造函数中正在执行许多逻辑。

一个问题:如何在构造函数的逻辑执行之前在这样的类中注入模拟?

其他信息:

这个类不是由我编写的,我不想因为可测试性原因更改其结构而违反此类中的现有接口。值得一提的是,它是一个ViewModel's类实例,在其实例化中,它在RxJava2流中运行身份验证检查,使用此viewModel的字段来获取所需的Observable。

因此,即使在@InjectMocks批注出现之前它也会抛出NullPointerException。如果我在测试类viewmodel的字段声明中尝试不实例化viewmodel,那么由于'MockitoException'而运行失败,这是因为尝试Mockito本身实例化一个对象,意图在其中注入模拟,但构造函数已经因NPE而失败。

那么,甚至可以在不违反“不改变测试类”规则的情况下解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这里唯一的真实的答案:你将时间和精力投入到错误的地方。

你看:

  

我们有一个类,其中在构造函数

中执行了很多逻辑

反模式。一次:因为它使你的课程测试如此困难。您完全适应这种情况:有意义地解析依赖项几乎是不可能的。如果您发现代码难以测试,那么这通常是糟糕设计的直接后果。因此,重构代码不仅可以使其可测试,而且还可以显着提高其质量!

但是你的解决方案"是使用模拟框架魔术作为创可贴。但这是错误的方法:因为你仍然无法轻易地实例化你所测试的对象"。随着时间的推移,这个问题将在各种其他症状中表现出来。

从这个意义上说:学习如何编写可测试的代码 - 例如通过观察这些videos

如果你真的想要/必须像这样保持那个类 - 那么请考虑使用依赖注入框架,例如guice