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方法呃,他们已经被注入了所有的依赖关系。除非我有办法拦截,否则我仍然处于寒冷之中。你可能应该考虑这个测试是否是一个综合测试,而不是一个单元测试,而不是完全嘲弄。