【问题标题】:In gradle kotlin dsl, how to call a dynamic test extension?在 gradle kotlin dsl 中,如何调用动态测试扩展?
【发布时间】:2020-05-27 17:41:43
【问题描述】:

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

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

在其源代码中,配置作为动态扩展被注入到 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 有没有一种简单的方法来实现同样的目标?

【问题讨论】:

    标签: gradle gradle-plugin gradle-kotlin-dsl gradle-task


    【解决方案1】:

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

    test.extensions.add("configMap", { Map<String, ?> c -> config.putAll(c) })
    

    您看到的com.github.maiflai.ScalaTestPlugin$_configure_closure6@45c21cac 应该是(Map&lt;String, Any&gt;) -&gt; Unit 类型的闭包,这意味着您可以这样做。我们必须更改地图值,所以我们假设它也是可变的。

    extensions.getByName("configMap").closureOf<MutableMap<String, Any?>> {
        this["db.name"] = "testdb"
        this["server"] = "192.168.1.188"
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多