使用Guice

时间:2018-03-13 08:41:33

标签: java unit-testing dependency-injection mockito guice

如何在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中存根和模拟响应。

有没有办法实现这一点,还是应该为模拟和真实对象创建单独的测试模块?或者我是否以错误的方式处理整个过程?

1 个答案:

答案 0 :(得分:2)

您可以使用spy方法执行此操作。

ConfigService realConfigService = new ConfigService();
ConfigService configService = Mockito.spy(realConfigService);
bind(ConfigService.class).toInstance(configService);

间谍的作用是,无论何时提供存根,它都会像对象被嘲笑一样行事。否则,它将调用对象的真实方法。

请查看此答案,了解更多in-depth theory