0

我们正在用 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 时初始化包属性。但是测试失败了。我在看什么?

4

1 回答 1

2

您需要从测试中直接或间接引用文件中定义的内容val myObject否则它生成的类将不会被加载。例如

@Test
public void testMyObjectLoaded() {
    your.package.FileNameKt.getMyObject();
    Assert.assertEquals(1, Dsl.Companion.getStored().size);
}
于 2019-07-31T08:42:32.237 回答