验证是否从构造函数中调用了方法

时间:2013-01-18 06:25:51

标签: java unit-testing guice mockito

我有一个构造函数,不幸的是必须做一些非平凡的事情:

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作为其第一个参数?

3 个答案:

答案 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注释)来从你的测试中调用。

其他选项:将注射器设置(或模块创建)分解出来并单独作为静态方法进行测试。