gpt4 book ai didi

gradle - 在 gradle kotlin dsl 中,如何调用动态测试扩展?

转载 作者:行者123 更新时间:2023-12-03 03:54:40 24 4
gpt4 key购买 nike

我正在尝试在使用 gradle ScalaTest 插件时添加一个新的配置选项:

https://github.com/maiflai/gradle-scalatest

在其源代码中,配置作为动态扩展注入(inject)到 Test 类中:

    static void configure(Test test) {
...
Map<String, ?> config = [:]
test.extensions.add(ScalaTestAction.CONFIG, config)
test.extensions.add("config", { String name, value -> config.put(name, value) })
test.extensions.add("configMap", { Map<String, ?> c -> config.putAll(c) })
...
}

如果使用 groovy 作为 dsl,调用这个属性很容易:
test {
configMap([
'db.name': 'testdb'
'server': '192.168.1.188'
])
}

不幸的是,由于静态类型,kotlin dsl 无法使用此方法,当作为测试插件调用时,它在测试范围内清晰可见,例如使用 extensions.getByName 时:
tasks {

test {

val map = extensions.getByName("configMap")
println(map)
}
}

它产生以下输出:
...


> Configure project :
com.github.maiflai.ScalaTestPlugin$_configure_closure6@45c21cac

但是没有办法在编译时检索或断言它的类型,最终它是无用的(除非使用反射,这违背了 kotlin dsl 的设计理念)。 kotlin dsl 有没有一种简单的方法来实现相同的目标?

最佳答案

我在 Scala 测试 gradle 插件中看到动态扩展是这样定义的:

test.extensions.add("configMap", { Map<String, ?> c -> config.putAll(c) })
com.github.maiflai.ScalaTestPlugin$_configure_closure6@45c21cac你看到的应该是 (Map<String, Any>) -> Unit 类型的闭包,这意味着你可以做到这一点。我们将不得不更改 map 值,所以让我们假设它也是可变的。
extensions.getByName("configMap").closureOf<MutableMap<String, Any?>> {
this["db.name"] = "testdb"
this["server"] = "192.168.1.188"
}

这构建得很好,但我没有安装 Scala,也从未使用过 Scala 测试。我不知道它是否真的有效,所以请告诉我。

关于gradle - 在 gradle kotlin dsl 中,如何调用动态测试扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62049505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com