EasyRandom未执行Kotlin数据类初始化块问题求助
问题分析
EasyRandom默认通过反射直接给类字段赋值,完全绕开了构造函数调用流程——而Kotlin的init块是和构造函数绑定执行的,所以你的校验逻辑根本没触发,才会出现所有字段非空的违规实例。
解决方案
1. 强制EasyRandom使用构造函数实例化
修改EasyRandom配置,让它必须通过构造函数创建对象,这样init块就会被执行,校验规则也会生效:
val parameters = EasyRandomParameters() .setUseConstructor(true) // 强制走构造函数流程 val easyRandom = EasyRandom(parameters) val leeftijd = easyRandom.nextObject(Leeftijd::class.java)
这时你会发现代码直接抛出IllegalArgumentException——这是正常现象,说明init块的校验生效了,接下来需要告诉EasyRandom如何生成符合约束的参数组合。
2. 自定义实例生成逻辑适配约束
因为不同operator对应不同的字段非空规则,需要给EasyRandom指定Leeftijd类的专属生成逻辑,这里可以用自定义ObjectFactory实现:
class LeeftijdFactory : ObjectFactory<Leeftijd> { override fun createInstance(type: Class<out Leeftijd>, randomizerContext: RandomizerContext): Leeftijd { val random = randomizerContext.random val operator = Leeftijd.LeeftijdOperator.values().random(random) return when(operator) { Leeftijd.LeeftijdOperator.IS_GELIJK_AAN, Leeftijd.LeeftijdOperator.JONGER_DAN, Leeftijd.LeeftijdOperator.OUDER_DAN -> { Leeftijd(operator, leeftijd = random.nextInt(0, 120)) } Leeftijd.LeeftijdOperator.TUSSEN -> { val min = random.nextInt(0, 100) val max = random.nextInt(min, 120) Leeftijd(operator, leeftijdMin = min, leeftijdMax = max) } } } }
然后把这个工厂注册到EasyRandom:
val parameters = EasyRandomParameters() .registerObjectFactory(Leeftijd::class.java, LeeftijdFactory()) val easyRandom = EasyRandom(parameters) val validLeeftijd = easyRandom.nextObject(Leeftijd::class.java)
这样生成的实例会完全符合init块的约束,同时init块也会被正常执行(因为是通过构造函数创建对象)。
3. 额外提示:修正枚举值拼写问题
你代码里when分支用了TUSSEN_LEEFTIJDEN,但枚举定义的是TUSSEN,这会导致编译错误,记得先修正这个问题,否则init块本身就无法正常运行。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

