我有一个构造函数,不幸的是必须做一些非平凡的事情:
public MyModule() {
this.setInjector(Guice.createInjector(new AfterInjectionModule(
PostConstruct.class, Matchers.any()), new MyGuiceModule()));
}
我现在需要验证在AfterInjectionModule
参数的方案中调用了PostConstruct.class
。我现在不关心其他参数。不幸的是,我想不出我会如何在Mockito中verify()
。我目前正在尝试以下方法:
this.reference = mock(new MyModule());
verify(this.reference).setInjector(Guice.createInjector(
new AfterInjectionModule(PostConstruct.class, Matchers.any()),
new MyGuiceModule()));
我的单元测试在上面的行中失败了。如何验证此方法是否已设置为Injector
AfterInjectionModule
,并将PostConstruct.class
作为其第一个参数?
答案 0 :(得分:1)
我认为问题不在于构造函数的模拟,而是对Guice.createInjector()的静态调用。由于您无法使用Mockito模拟静态方法,因此您可以尝试验证行为的结果(可能很困难),也可以使用Powermock等其他工具来覆盖静态方法。
答案 1 :(得分:0)
不是测试实际调用,而是测试MyModule是否按预期运行,如果它调用了new AfterInjectionModule(PostConstruct.class, Matchers.any())
并且它的行为不像它没有调用那样。
鉴于这是关于Guice注入器,验证行为可以像检查注入器提供的类是否实际上是由AfterInjectionModule
使用这些参数初始化的类的实例一样简单。 / p>
答案 2 :(得分:0)
你在这里有点麻烦,因为如果你使用Mockito,你无论如何都不会使用你自己的构造函数。请注意,您的代码也会在构造函数中添加稍微偏重的逻辑,即not a good idea。
如果您想坚持使用Mockito,请将教师设置代码分解为init()
方法,您可以从测试中调用该方法。如果你真的想要,你仍然可以从你的构造函数中调用该方法,但你也可以使它足够可见(可能用@VisibleForTesting
注释)来从你的测试中调用。
其他选项:将注射器设置(或模块创建)分解出来并单独作为静态方法进行测试。