【问题标题】:Dagger Field Injection Testing匕首现场注入测试
【发布时间】:2017-12-14 18:44:19
【问题描述】:

我正在使用 Dagger 2,在为我的类实现测试时,在模块中生成单例提供程序时遇到了一些问题。

class SomeContentProvider extends ContentProvider {

    // this should be normal foo if run by application, 
    // or mocked foo if run by tests
    @Inject Foo foo;

    public Provider() {
        Component.getComponent().inject(this);
    }
}

@Module
class ProviderModule {
    @Singleton
    @Provides
    Foo providesFoo() {
        returns new Foo();
    }
}

@Module
class ProviderTestModule {
    @Singleton
    @Provides
    Foo providesFoo() {
        returns Mockito.mock(Foo.class);
    }
}


public class SomeContentProviderTests extends InstrumentationTestCase {

    @Inject Foo foo; // this should be mocked Foo

    @Override
    public void setUp() throws Exception {
        super.setUp();

        MockitoAnnotations.initMocks(this);

        Component.getTestComponent().inject(this);
    }

    public void test1() {
        // needs new instance of Foo when test1 is run from SomeContentProvider
    }

    public void test2() {
        // needs another new instance of Foo when test2 is run from SomeContentProvider
    }
}

所以我有 2 个问题。

  1. 我不能使用构造函数注入,因为ContentProvider 有一个默认构造函数。 SomeContentProvider如何从测试模块中获取Foo?

  2. test1test2 中,如何确保在运行每个测试时创建Foo 的新实例?

谢谢!

【问题讨论】:

  • 所以现在我的意图是创建Foo 的另一个字段和SomeContentProvider 的另一个构造函数,该构造函数接受Foo 仅用于测试目的,注入后,如果该字段确实存在,替换注入的Foo

标签: android mockito dagger-2


【解决方案1】:

我发现这篇文章对我特别有用。虽然我遇到的特定问题更加复杂 - 但我使用相同的想法来模拟模块的提供者。

How do you override a module/dependency in a unit test with Dagger 2.0?

【讨论】:

    【解决方案2】:

    如果您有多个相同类型的依赖项,则应使用@Named 注释来确定要注入的依赖项。

    有关详细信息,请参阅文档:https://google.github.io/dagger/users-guide#qualifiers

    【讨论】:

    • 我不确定您是否正确理解了我的问题。在我的情况下不需要名称限定符。
    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多