0

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

public MyModule() {
    this.setInjector(Guice.createInjector(new AfterInjectionModule(
            PostConstruct.class, Matchers.any()), new MyGuiceModule()));
}

我现在需要验证是否AfterInjectionModule使用参数在事物方案中调用了PostConstruct.class。我现在不太关心其他参数。不幸的是,我想不出verify()在 Mockito 中我会怎么做。我目前正在尝试以下方法:

this.reference = mock(new MyModule());
verify(this.reference).setInjector(Guice.createInjector(
        new AfterInjectionModule(PostConstruct.class, Matchers.any()), 
        new MyGuiceModule()));

我的单元测试在上面一行失败了。如何验证此方法是否设置为作为第一个参数Injector传递AfterInjectionModule的?PostConstruct.class

4

3 回答 3

1

我认为问题不在于构造函数的模拟,而在于对 Guice.createInjector() 的静态调用。由于您无法使用 Mockito 模拟静态方法,因此您可以尝试验证行为的结果(可能很困难)或使用其他工具(如 Powermock)来覆盖静态方法。

于 2013-01-18T20:22:03.447 回答
0

与其测试实际调用,不如测试 MyModule 在调用时是否按预期new AfterInjectionModule(PostConstruct.class, Matchers.any())运行,以及在未调用时是否按预期运行。

鉴于这是关于 Guice 注入器,验证行为可以像检查注入器提供的类是否实际上是AfterInjectionModule使用这些参数初始化提供的类的实例一样简单。

于 2013-01-18T10:35:50.983 回答
0

你在这里有点麻烦,因为如果你使用 Mockito,你无论如何都不会使用你自己的构造函数。请注意,您的代码还在您的构造函数中放置了稍微重一些的逻辑,这不是一个好主意

如果您想坚持使用 Mockito,请将教师设置代码分解为init()您可以从测试中调用的方法。如果你真的想要,你仍然可以从你的构造函数中调用该方法,但你也可以让它足够可见(可能用 注释@VisibleForTesting)从你的测试中调用。

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

于 2013-01-18T17:29:11.887 回答