java - 在构造函数的逻辑出现之前将模拟注入(inject)类

标签 java android testing mocking mockito

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

一个问题:如何在构造函数逻辑执行之前在此类中注入(inject)模拟?

附加信息:

此类不是我编写的,出于可测试性原因,我不想通过更改其结构来违反此类中的现有接口(interface)。值得一提的是,它是一个 ViewModel's类实例并在其实例化时,它在 RxJava2 流程中运行身份验证检查,使用此 viewModel 的字段来获取所需的 Observables。

因此,它甚至在 @InjectMocks 注释出现之前就抛出 NullPointerException。如果我尝试不在测试类 viewmodel 的字段声明中实例化 viewmodel,则由于“MockitoException”导致运行失败,这是由于 Mockito 本身尝试实例化一个对象并在之后向其注入(inject)模拟,但构造函数已因 NPE 而失败。

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

最佳答案

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

你看:

we have a class, in which a lot of logic is being executed inside a constructor

是一个反模式。一次:因为它让测试你的类(class)变得如此困难。您恰好遇到了这样的情况:对您的依赖性 进行有意义的解决几乎是不可能的。如果您发现您的代码难以测试,那么这通常是糟糕设计的直接后果。因此,重构您的代码不仅可以使其可测试,还可以显着提高其质量!

但是您的“解决方案”是使用模拟框架魔术作为创可贴。但这是错误的方法:因为您仍然无法轻松地实例化您的“被测对象”。随着时间的推移,这个问题会以各种其他症状表现出来。

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

如果您真的想要/必须保持该类的原样 - 那么最好考虑使用依赖注入(inject)框架,例如 guice .

关于java - 在构造函数的逻辑出现之前将模拟注入(inject)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48933822/

相关文章:

android - 使用系统中的图标与将它们复制到您的项目中

java - 如何签署 Java Midlet?

java - JAX-RS 和 EJB 异常处理

java - 使用 Outlook 电子邮件将新行追加到 Java StringBuilder

android - 改造空闲 java.lang.IllegalStateException : Method path does not contain {}

android - 如何使用 RSSI 改进蓝牙距离测量?

testing - Grails 的集成测试报告在哪里?

testing - 如何为网站设立焦点小组

testing - 如何使用马拉松测试工具(MarathonITE)从命令行运行少量测试用例或测试套件?

java - java 以降序打印文件内容