android - Dagger 场注入(inject)测试

标签 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
    }
}

所以我有 2 个问题。

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

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

谢谢!

最佳答案

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

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

关于android - Dagger 场注入(inject)测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47820148/

相关文章:

android - Android 中的水平可扩展 ListView

android - ContextCompat 与 Mockito NullPointerException

android - Activity 转换 : OnActivityReenter: onPreDraw never called

java - 如何模拟 void 静态方法以使用 Powermock 引发异常?

java - Mockito异常

android - 如何在 SDK 中使用 Dagger 2?

android - 设置微调器项目的 ID

java - 使用mockito进行Rest API的JUnit测试用例

android - 如何将Retrofit对象直接注入(inject)到存储库类中?

android - 使用 Dagger 2 注入(inject) Androidx Activity