当我使用 org.jeasy.random.Easyrandom 生成类的随机实例时,它不会执行 init 块内的代码。
我的 kotlin 数据类如下所示:
data class Leeftijd(
val operator: LeeftijdOperator,
val leeftijd: Int? = null,
val leeftijdMin: Int? = null,
val leeftijdMax: Int? = null
) {
enum class LeeftijdOperator {
IS_GELIJK_AAN, JONGER_DAN, OUDER_DAN, TUSSEN
}
init {
when (operator) {
IS_GELIJK_AAN, JONGER_DAN, OUDER_DAN -> {
requireNotNull(leeftijd)
require(leeftijdMin == null)
require(leeftijdMax == null)
}
TUSSEN_LEEFTIJDEN -> {
require(leeftijd == null)
require(requireNotNull(leeftijdMin) <= requireNotNull(leeftijdMax))
}
}
}
}
如果我调用
EasyRandom().nextObject(Filter::class.java)
,它会生成一个所有字段都不为空的实例。但根据 init 块,至少有一个字段应始终为空。
有什么方法可以告诉 EasyRandom 它至少必须调用这个 init 块吗?所以我必须正确配置 EasyRandom 来实例化我的数据类。
使用 EasyRandom 无法完成此操作。请参阅文档:
Easy Random 旨在生成随机 Java Bean。根据定义,Java Bean 应该提供默认构造函数。如果目标类型不提供默认构造函数,Easy Random 仍会尝试生成它的随机实例,但这并不能保证在所有情况下都有效。事实上,Easy Random 将回退到 objenesis 来创建对象(这可以通过提供自定义 ObjectFactory 而不是默认的 ObjenesisObjectFactory 来覆盖),从而绕过任何构造函数。
您的 Kotlin 数据类不是 Java Bean。它有一个非默认(即无参数)构造函数,并且有一个
init
块,就 JVM 而言,它是构造函数的一部分。 EasyRandom 通过简单地将属性的支持字段设置为随机值来创建数据类。
您可以做的是通过使用随机参数调用构造函数来创建随机实例。