Dagger 现场注入测试

Dil*_*lon 5 android mockito dagger-2

我正在使用 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
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题。

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

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

谢谢!

Dil*_*lon 1

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

如何使用 Dagger 2.0 覆盖单元测试中的模块/依赖项?