在gradle中隐藏传递依赖

时间:2019-05-21 16:15:43

标签: java gradle

项目设置:Gradle5,Spring5

我们想使用 JUnit5 作为测试工具。我们从 Spring5 依赖项中排除了 JUnit4 ,但是我们有一个第三方库,该库仍然依赖 JUnit4 ,并且不允许将其排除。我们试图在全局范围内排除 JUnit4 ,但随后我们的项目无法编译。

目标:我们的目标是将 JUnit4 隐藏在编译依赖项中,以便开发人员无法使用 JUnit4 类代替 JUnit5 < / em>意外上课。

成绩:

dependencies {
    implementation('org.springframework.boot:spring-boot-starter')
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit'
    }
    testImplementation('org.testcontainers:testcontainers:1.10.2') {
        exclude group: 'junit', module: 'junit'
    }
    testImplementation('org.testcontainers:postgresql:1.7.3') {
        exclude group: 'junit', module: 'junit'
    }
    testImplementation('org.testcontainers:junit-jupiter:1.11.2')
    testImplementation('org.mockito:mockito-junit-jupiter:2.23.0')
    testImplementation('org.junit.jupiter:junit-jupiter-api:5.3.1')
    testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.3.1')
}

我们的依赖项中的相关部分:

testCompileClasspath
+--- org.springframework.boot:spring-boot-starter-test -> 2.1.3.RELEASE
    ... (junit4 excluded)
+--- org.testcontainers:testcontainers:1.10.2
|    +--- junit:junit:4.12
|    |    \--- org.hamcrest:hamcrest-core:1.3
     ...
+--- org.junit.jupiter:junit-jupiter-api:5.3.1 (*)
\--- org.junit.jupiter:junit-jupiter-engine:5.3.1

期望的行为:

@Testcontainers
public class MyTestcontainersTests {

    @Container
    private PostgreSQLContainer postgresqlContainer = new PostgreSQLContainer()
            .withDatabaseName("foo")
            .withUsername("foo")
            .withPassword("secret");

    @org.junit.jupiter.api.Test
    void test() {
        org.junit.jupiter.api.Assertions.assertTrue(postgresqlContainer.isRunning());
    }

    @org.junit.Test // compile error
    void oldTest() {
        org.junit.Assert.fail("this should be a compile error");
    }

}

您可以在github上找到示例代码

2 个答案:

答案 0 :(得分:0)

如果您希望库在编译时不可用,但在运行时仍然存在,则只需执行以下操作:

configurations {
    testImplementation {
        // Globally exclude JUnit, will not be on the testCompileClasspath thus
        exclude group: 'junit', module: 'junit'
    }
}
dependencies {
    // Make sure JUnit is on the testRuntimeClasspath
    testRuntimeOnly("junit:junit:4.12")
}

如果您需要为另一个库的生产源设置类似的设置,请删除配置名称的test前缀,并调整排除坐标和依赖坐标。

答案 1 :(得分:0)

我刚刚尝试使用gradle 5.6.3,并且OP的方法成功删除了所有JUnit4依赖项。