You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Gradle任务传递属性至单元测试失败,System.getProperty返回null问题排查

问题分析与解决方案

咱们来一步步拆解你遇到的问题,找到核心原因和解决办法:

1. 重复任务注册的冲突问题

你同时用两种方式定义了withFeature任务:

  • 先用task("withFeature", JavaExec::class)完整定义了一个JavaExec类型的任务
  • 又用tasks.register("withFeature")重复注册了同名任务

这会导致Gradle任务定义冲突,直接删掉tasks.register("withFeature")这一行,保留第一个完整的任务定义即可。

2. 测试任务未配置属性传递逻辑

你通过-Pfeature=default传入的是Gradle项目属性,但单元测试运行在独立的JVM进程中,不会自动继承Gradle的项目属性。而你的测试代码用System.getProperty("feature")读取的是JVM系统属性,两者不是同一个概念,这就是为什么你拿到null的核心原因。

解决方法:给test任务配置属性传递

在你的Gradle配置文件(比如feature.gradle或者主build.gradle)中,添加对test任务的配置,把Gradle的feature项目属性映射为测试JVM的系统属性:

test {
    // 如果传入了feature属性就用它,否则用默认值"default"
    systemProperty "feature", project.findProperty("feature") ?: "default"
}

配置完成后,执行以下命令:

./gradlew test -Pfeature=default

此时测试代码里的System.getProperty("feature")就能正确拿到"default"值了。

额外补充:如果想通过withFeature触发测试

如果你本来是想通过withFeature任务触发测试并传递参数,可以给withFeature添加对test任务的依赖,确保执行顺序和属性传递:

task("withFeature", JavaExec::class) { 
    group = "myCustomTasks" 
    main = "com.example.calculator" 
    classpath = sourceSets["main"].runtimeClasspath 
    args(project.findProperty("feature") ?: "default")
    // 让withFeature执行前先跑test任务
    dependsOn(test)
}

之后执行:

./gradlew withFeature -Pfeature=default

这样既会运行能拿到参数的测试任务,也会执行你的JavaExec任务。

内容的提问来源于stack exchange,提问作者AShX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:42:46