我们正在Kotlin写一个内部DSL。然后从Java代码中使用它。我们看到DSL中定义的对象还不可用。因此,问题是:为什么没有初始化包属性?
因此,简化的情况是:
val myObject = dsl {
...
}
DSL:
class Dsl() {
companion object {
val stored = mutableListOf<Dsl>()
fun add(added: Dsl) {
stored += added
}
}
}
fun dsl(init: Dsl.() -> Unit) {
val dsl = Dsl()
dsl.init()
Dsl.add(dsl) // Intentional side effect to simplify DSL definition
}
使用Java的DSL:
public class ExpectMyObject {
@Test
public void testMyObjectLoaded() {
Assert.assertEquals(1, Dsl.Companion.getStored().size)
}
}
我期望在启动JVM时初始化package属性。但测试失败了。我在看什么?
发布于 2019-07-31 00:42:32
您需要直接或间接地从测试中引用与val myObject
相同的文件中定义的内容。否则它生成的类将不会被加载。例如。
@Test
public void testMyObjectLoaded() {
your.package.FileNameKt.getMyObject();
Assert.assertEquals(1, Dsl.Companion.getStored().size);
}
https://stackoverflow.com/questions/57286535
复制