dependency-injection - Mockito 和 Guice : mocking a @Provides method

标签 dependency-injection mockito guice vert.x

我的类(class)中有一个名为 MainModule 的模块。它有各种绑定(bind),其中一个绑定(bind)到我的自定义服务接口(interface),称为 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 被注入(inject)到不同类的其他地方,并且在这个对象上调用了一些方法。

在我的单元测试中,我打算使用 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 对象的真实对象。我错过了什么吗?

最佳答案

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

有几种可能性......可能最简单的一种是仅严格使用构造函数注入(inject)并通过“new”创建被测类的实例,然后将它们单独创建的模拟实例交给它们。

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

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

关于dependency-injection - Mockito 和 Guice : mocking a @Provides method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27453393/

相关文章:

java - 多重绑定(bind)的 IoC 问题

dependency-injection - Dropwizard 和 Guice : injecting Environment

java - 如何注入(inject)Presenter和View界面MVP dagger 2

dependency-injection - Windows Phone 8 的 IoC/DI 库是什么?

python - 为什么 python 没有 Spring DI(组件生命周期)框架?

java - 通过 Spark 反/序列化时,使用 void 方法的模拟会导致 'local class name incompatible with stream class name "void"'

java - 调用未 stub 的方法时抛出 RuntimeException

java - Mockito - 检查是否在对象上调用了 NO 方法(未访问对象)

Hadoop 作业 : Error injecting constructor, JAXBException

android - Dagger 2 - 注入(inject)构造函数或提供方法哪个更好?