Java Gradle 4-测试对另一个项目的依赖性';s测试

Java Gradle 4-测试对另一个项目的依赖性';s测试,java,unit-testing,gradle,build,Java,Unit Testing,Gradle,Build,我有以下多项目结构: / build.gradle common/ build.gradle src/main/ resources/common.properties java/... src/test/ resources/common.properties java/... app/ build.gradle

我有以下多项目结构:

/
    build.gradle
    common/
        build.gradle
        src/main/
            resources/common.properties
            java/...
        src/test/
            resources/common.properties
            java/...
    app/
        build.gradle
        src/main/java/...
        src/test/java/...
    admin/
        build.gradle
        src/main/java/...
        src/test/java/...
common
项目包含一些常用方法,它们有自己的单元测试和一个
CommonDefs
类,该类包含从
common.properties
加载的数据。当运行单元测试时,测试资源中的
common.properties
文件可能会覆盖主资源中的文件,并且测试会按预期工作

当为
app
admin
项目运行单元测试时,问题就开始了,这些项目包含使用公共项目中的
CommonDefs
的测试

到目前为止,我已经使用了一种类似于该方法的通用解决方案,它已经完美地工作了几年。这是root
build.gradle
包含的内容:

allprojects {
    plugins.withType(JavaPlugin) {
        configurations {
            testOutput
        }

        dependencies {
            testOutput sourceSets.test.output
        }
    }
}
app/build.gradle
admin/build.gradle
都包含:

dependencies {
    compile project(":common")
    testCompile project(path: ":common", configuration: "testOutput")
    // ...
}
我决定是时候升级Gradle了(以前使用的是2.14.1),所以我开始用Gradle4.2.1测试这个项目。现在每次我运行
app
admin
的测试时,
CommonDefs
都会从
src/main/resources/common.properties
加载数据,而不是
src/test/resources/common.properties

我已经尝试打印应用程序项目的测试类路径,Gradle 4.2.1似乎首先使用了common的主JAR:

path\to\app\build\classes\java\test
path\to\app\build\resources\test
path\to\app\build\classes\java\main
path\to\app\build\resources\main
path\to\common\build\libs\common.jar
path\to\common\build\classes\java\test
path\to\common\build\resources\test
对于Gradle 2.14.1,结果是:

path\to\app\build\classes\test
path\to\app\build\resources\test
path\to\app\build\classes\main
path\to\app\build\resources\main
path\to\common\build\classes\test
path\to\common\build\resources\test
path\to\common\build\libs\common.jar
有没有办法告诉较新版本的Gradle将
common
的测试输出优先于其主输出

注意

我还尝试在app/build.gradle中使用以下内容:

evaluationDependsOn(":common")

dependencies {
    compile project(":common")
    testCompile project(":common").sourceSets.test.output
}

这似乎是可行的,但它看起来相当粗糙,如果可能的话,我想坚持使用配置的解决方案。

依赖类路径排序总是一个坏主意,您有没有可能将
common.properties
移动到
$env/common.properties
?然后,您可以拥有唯一的路径,例如
prod/common/properties
uat/common.properties
单元测试/common.properties
集成测试/common.properties
等。您可以使用系统属性选择$env(默认为“prod”以实现向后兼容性)