我正在使用 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 个问题。
我不能使用构造函数注入(inject),因为
ContentProvider
有默认构造函数。SomeContentProvider
如何从测试模块获取 Foo?在
test1
和test2
中,如何确保在运行每个测试时创建一个新的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/