如何在Guice测试模块中创建一个对象,该对象在一个测试中用作模拟,但在另一个测试中需要是真实对象。
例如。 考虑我有一个名为ConfigService的类。这使用构造函数注入到另一个名为 UserService 的类中。在测试期间,我使用了一个测试模块,它有各种类和它们的模拟。
测试模块.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。
如果我想对配置服务测试使用相同的测试模块,我现在如何将我之前创建的配置服务的模拟对象更改为实际的用于测试的对象。反之亦然也是一个问题->即。如果我有一个真正的配置服务对象,我如何在UserService.class中存根和模拟响应。
有没有办法实现这一目标,或者我应该为模拟和真实对象创建单独的测试模块?还是我以错误的方式完成了整个过程?
您可以使用spy
方法执行此操作。
ConfigService realConfigService = new ConfigService();
ConfigService configService = Mockito.spy(realConfigService);
bind(ConfigService.class).toInstance(configService);
间谍所做的是,每当您提供存根时,它的行为就好像对象被嘲笑一样。否则,它将调用对象的真实方法。
请查看此答案以获取更深入的理论。