我正在尝试在我的 Android 仪器测试中将 Dagger 2 用于 DI。它适用于主应用程序组件中的类/活动/片段,但我的测试组件似乎缺少一些我找不到的绑定。任何关于如何去做的想法都将不胜感激。我的代码如下所示:
AssetRepositoryTest
public class AssetRepositoryTest {
@Nested
@DisplayName("Given a populated database")
public class PopulatedDatabaseInstance {
@Inject
private TestDatabase database;
@Inject
private AssetRepository repository;
@BeforeEach
public void setup() {
final TestApplication application = ApplicationProvider.getApplicationContext();
application.androidInjector().inject(this);
// Setup database
}
// Tests
}
}
运行仪器测试我得到以下异常:
java.lang.IllegalArgumentException: No injector factory bound for Class<AssetRepositoryTest.PopulatedDatabaseInstance>
而dagger相关代码如下:
测试组件
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
TestPersistenceModule.class
})
public interface TestComponent extends AndroidInjector<TestApplication> {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<TestApplication> {
}
}
测试持久性模块
@Module(includes = TestRoomModule.class)
public abstract class TestPersistenceModule {
@Binds
abstract AssetRepository bindAssetRepository(final AssetRepositoryImpl repository);
}
测试室模块
@Module
public class TestRoomModule {
@Provides
@Singleton
TestDatabase provideTestDatabase(final Application application) {
return Room.inMemoryDatabaseBuilder(application, TestDatabase.class).build();
}
@Provides
@Singleton
AssetDao provideAssetDao(final TestDatabase testDatabase) {
return testDatabase.getAssetDao();
}
}
测试应用
public class TestApplication extends DaggerApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerTestComponent.builder().create(this);
}
}
除此之外,我有一个自定义AndroidJUnitRunner
扩展类,它覆盖该newApplication
方法并TestApplication
为测试用例返回一个实例。
我AssetRepositoryImpl
的如下:
AssetRepositoryImpl
@Singleton
public class AssetRepositoryImpl extends AbstractRepository<Asset, AssetEntity> implements AssetRepository {
@Inject
protected WorkspaceDao workspaceDao;
@Inject
public AssetRepositoryImpl(final AssetDao dao, final AssetMapper mapper) {
super(dao, mapper);
}
}
我没有在此处粘贴的类@Inject
在其构造函数中具有注释,并且此代码在具有各自主要模块和组件的主应用程序中正常工作。
作为最后的想法,AssetRepositoryTest.PopulatedDatabaseInstace
由 JUnit 实例化的 . 因此不是由 Dagger 实例化的,据我所知,这似乎是这里的问题。
如何告诉 Dagger 如何将这些字段注入到我的 JUnit 测试类中?