Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 验证是否从构造函数调用了方法_Java_Unit Testing_Guice_Mockito - Fatal编程技术网

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

Java 验证是否从构造函数调用了方法,java,unit-testing,guice,mockito,Java,Unit Testing,Guice,Mockito,我有一个构造函数,不幸的是,它必须做一些非常重要的事情: public MyModule() { this.setInjector(Guice.createInjector(new AfterInjectionModule( PostConstruct.class, Matchers.any()), new MyGuiceModule())); } 我现在需要验证AfterInjectionModule是否在带有PostConstruct.class参数的方案中

我有一个构造函数,不幸的是,它必须做一些非常重要的事情:

public MyModule() {
    this.setInjector(Guice.createInjector(new AfterInjectionModule(
            PostConstruct.class, Matchers.any()), new MyGuiceModule()));
}
我现在需要验证
AfterInjectionModule
是否在带有
PostConstruct.class
参数的方案中被调用。我现在对其他参数毫不关心。不幸的是,我想不出如何在Mockito中
验证()。我目前正在尝试以下操作:

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

我的单元测试在上述行失败。我如何验证此方法是否设置为
注入器
,该注入器通过
AfterInjectionModule
,并将
PostConstruct.class
作为其第一个参数?

如果MyModule确实调用了
new AfterInjectionModule,则应测试MyModule是否按预期运行(PostConstruct.class,Matchers.any())
并且如果不调用它,它的行为将与它的行为不同


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

这里有点麻烦,因为如果使用Mockito,就不会使用请注意,您的代码还在构造函数中放入了稍微重一点的逻辑,这就是

如果您想继续使用Mockito,请将讲师设置代码分解成一个可以从测试中调用的
init()
方法。如果您确实想这样做,您仍然可以从构造函数中调用该方法,但也可以使其足够可见(可以用
@VisibleForTesting
注释)以从测试中调用


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

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

我会使用
PowerMockito
mockNew
好的,我该怎么做?你能提供一个带说明的答案吗?不幸的是,这说起来容易做起来难。
AfterInjectionModule
在Guice类上查找注释并在后面调用init方法呃,他们已经被注入了所有的依赖关系。除非我有办法拦截,否则我仍然处于寒冷之中。你可能应该考虑这个测试是否是一个综合测试,而不是一个单元测试,而不是完全嘲弄。