Mockito和Guice:嘲笑@Provides方法

时间:2014-12-12 22:54:39

标签: dependency-injection mockito guice vert.x

我的班级中有一个名为MainModule的模块。它有各种绑定,其中一个绑定到我的自定义服务接口HttpClientPool

public class MainModule extends AbstractVertxModule{
        binder.bind(HttpClientPool.class).to(HttpClientPoolImpl.class).in(Singleton.class);
        // other bindings
} 

@Provides @Singleton
    public TokenClient tokenClient(HttpClientPool clientPool){
        return new TokenClient(clientPool);
}

该模块也是一个名为tokenClient的对象的提供者,如上所示。

tokenClient正在另一个类的其他地方注入,并且在这个对象上调用了一些方法。

在我的单元测试中,我打算使用Mockito来获取一个模拟的tokenClient对象。这意味着,我希望MainModule提供一个模拟对象,而不是真实对象。我尝试过使用如下所示的testMainModule:

public class testMainModile implements Module{
    private TokenClient tokenClient;

    public TokenModule(TokenClient client) {
        this.tokenClient= client;
    }

    @Override
    public void configure(Binder binder) {
        binder.bind(TokenClient.class).toInstance(tokenClient);
    }
}

我单位测试的摘录:

@Mock
private TokenClient tokenClient;
// Stuff between
Injector messagingInjector = Guice.createInjector(new TestMainModule(tokenClient));
        mainModule = messagingInjector.getInstance(MainModule.class);

不知何故,我得到的是来自mainModule对象的真实对象。我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我假设您有一个提供某些功能的类。这是您要进行单元测试的类。它需要您注入到类中的tokenClient才能正常工作。 所以你面临的问题是:我测试的类如何在测试时注入一个模拟的tockenClient。

有几种可能性......可能最简单的方法是严格使用构造函数注入,并通过" new"来创建测试类的实例。然后将它们分别创建为模拟实例。

如果你想坚持使用guice,可以override Bindings and Providers甚至提供完全隔离的测试模块。

我更喜欢使用needle4j框架(我是一个贡献者,所以我有偏见),一个依赖注入模拟器,默认注入模拟,除非配置为否则。如果使用正确(坚持使用一个类单元,不要尝试设置集成级别测试),这可能是根据注入的实例测试类的最快速和最简单的方法。