EasyRandom 遵循初始化块

问题描述 投票:0回答:1

当我使用 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 来实例化我的数据类。

kotlin
1个回答
0
投票

使用 EasyRandom 无法完成此操作。请参阅文档

Easy Random 旨在生成随机 Java Bean。根据定义,Java Bean 应该提供默认构造函数。如果目标类型不提供默认构造函数,Easy Random 仍会尝试生成它的随机实例,但这并不能保证在所有情况下都有效。事实上,Easy Random 将回退到 objenesis 来创建对象(这可以通过提供自定义 ObjectFactory 而不是默认的 ObjenesisObjectFactory 来覆盖),从而绕过任何构造函数。

您的 Kotlin 数据类不是 Java Bean。它有一个非默认(即无参数)构造函数,并且有一个

init
块,就 JVM 而言,它是构造函数的一部分。 EasyRandom 通过简单地将属性的支持字段设置为随机值来创建数据类。

您可以做的是通过使用随机参数调用构造函数来创建随机实例。

© www.soinside.com 2019 - 2024. All rights reserved.