如何在Guice Test模块中创建一个对象,该模块在一次测试中用作模拟,但需要在另一个测试中成为真实对象。
例如。 考虑我有一个名为ConfigService的类。这是使用构造函数注入注入另一个名为UserService的类。在测试期间,我使用了一个TestModule,它有各种类和它们的模拟。
TestModule.java:
public class TestModule extends AbstractModule{
@Override
public void configure() {
ConfigService configService = Mockito.mock(ConfigService.class);
bind(ConfigService.class).toInstance(configService);
UserService userService = new UserService(configService);
bind(UserService.class).toInstance(userService);
}
}
在UserServiceTest中,我创建一个注入器并使用此TestModule中的实例。
Injector injector = Guice.createInjector(new TestModule());
userService = injector.getInstance(UserService.class);
configService = injector.getInstance(ConfigService.class);
这很好用,我现在遇到问题的地方是我需要测试ConfigService.class。
如果我想为ConfigServiceTest使用相同的TestModule,我现在如何将之前创建的ConfigService的模拟对象更改为实际的模拟对象进行测试。反之亦然也是一个问题 - >即。如果我有一个ConfigService的真实对象,我如何在UserService.class中存根和模拟响应。
有没有办法实现这一点,还是应该为模拟和真实对象创建单独的测试模块?或者我是否以错误的方式处理整个过程?
答案 0 :(得分:2)
您可以使用spy
方法执行此操作。
ConfigService realConfigService = new ConfigService();
ConfigService configService = Mockito.spy(realConfigService);
bind(ConfigService.class).toInstance(configService);
间谍的作用是,无论何时提供存根,它都会像对象被嘲笑一样行事。否则,它将调用对象的真实方法。
请查看此答案,了解更多in-depth theory。