Scala测试中获取Gradle属性失败,该如何解决?
解决Gradle Scala测试中无法读取~/.gradle/gradle.properties系统属性的问题
问题复盘
你在~/.gradle/gradle.properties里配置了com.my.path=/path/to/stuff,Scala测试代码通过sys.props.getOrElse获取该属性时总是抛出异常。尝试给属性加systemProp.前缀、在build.gradle里设置systemProperties = System.properties后,要么无效果,要么测试运行器报错“未找到测试”,且你是通过IntelliJ运行测试。
有效解决方案
方案1:正确配置全局gradle.properties的系统属性
Gradle要求要暴露给JVM的系统属性必须带systemProp.前缀,修改~/.gradle/gradle.properties为:
systemProp.com.my.path=/path/to/stuff
配置后执行以下操作确保生效:
- 点击IntelliJ中Gradle工具窗口的刷新按钮(大象图标旁的箭头)
- 执行Gradle任务
cleanTest后重新运行测试
方案2:在build.gradle中安全传递属性
不要直接用systemProperties = System.properties覆盖默认配置(这会丢失测试运行器的必要参数),而是显式传递目标属性:
test { // 方式1:传递单个指定属性 systemProperty "com.my.path", System.getProperty("com.my.path") // 方式2:批量传递所有带systemProp.前缀的属性 systemProperties(System.properties.findAll { it.key.startsWith('systemProp.') }.collectEntries { [(it.key - 'systemProp.'): it.value] }) }
方案3:在IntelliJ运行配置中手动指定参数
如果是通过IntelliJ的Run Configuration运行测试,可直接给测试VM添加参数:
- 打开Run/Debug Configurations面板
- 找到你的Scala测试配置项
- 在VM options栏中添加:
-Dcom.my.path=/path/to/stuff - 保存配置后重新运行测试
验证方法
可以在测试代码中临时添加打印语句,确认属性是否被正确读取:
class MyTest extends FunSuite { val path = sys.props.getOrElse("com.my.path", throw new RuntimeException("nope!")) println(s"读取到的路径:$path") // 验证用,测试完成后可删除 }
内容的提问来源于stack exchange,提问作者Big McLargeHuge
相关产品推荐
相关产品推荐

