我正在努力将相对较大的代码库重构为较小的 Gradle 构建和/或模块,尝试使用新的 Kotlin DSL 和构建脚本的最佳实践。
我无法从文档中弄清楚的一个相当不成熟的问题是:我应该在哪里集中管理我的存储库声明?不同的结构如何影响所述存储库的分辨率?
详细说明这一点,我可以通过以下方式声明存储库:
allprojects {},不鼓励在文件内部或文件subprojects {}中进行交叉配置:build.gradle.ktsallprojects {
repositories {
...
}
}
Run Code Online (Sandbox Code Playgroud)
subprojects {
repositories {
...
}
}
Run Code Online (Sandbox Code Playgroud)
dependencyResolutionManagement {}中的块settings.gradle.kts:dependencyResolutionManagement {
repositories {
...
}
}
Run Code Online (Sandbox Code Playgroud)
pluginManagement {}中的块settings.gradle.kts:pluginManagement {
repositories {
...
}
}
Run Code Online (Sandbox Code Playgroud)
buildscript {}块:buildscript {
repositories {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这些声明以不同的方式影响构建生命周期不同部分的可用存储库。这就是重点。我什么时候应该使用它们中的每一种,或者在某些情况下应该使用其中不止一种?块中声明的存储库是否会dependencyResolutionManagement {}干扰下载插件的存储库(pluginManagement {}块内声明的存储库)?这些存储库是否以任何方式组合或覆盖,或者它们是完全独立的存储库集?
我正在尝试在 Android 仪器测试中使用 Dagger 2 进行 DI。它对于主应用程序组件中的类/活动/片段工作得很好,但我的测试组件似乎缺少一些我找不到的绑定。任何有关如何进行的想法将不胜感激。我的代码如下所示:
资产库测试
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
}
}
Run Code Online (Sandbox Code Playgroud)
运行仪器测试时出现以下异常:
java.lang.IllegalArgumentException: No injector factory bound for Class<AssetRepositoryTest.PopulatedDatabaseInstance>
Run Code Online (Sandbox Code Playgroud)
与匕首相关的代码如下:
测试组件
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
TestPersistenceModule.class
})
public interface TestComponent extends AndroidInjector<TestApplication> {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<TestApplication> {
}
} …Run Code Online (Sandbox Code Playgroud)