Kotlin单元测试中如何为val属性赋值(不可修改实体类)
解决Kotlin单元测试中为val属性赋值的问题
由于created是val类型属性,且无法修改Request类的代码,只能通过反射绕过访问限制来修改其值,具体实现方案如下:
方案一:直接通过反射修改字段
在测试方法中直接使用Java反射API获取created字段,开启可访问权限后赋值:
@Test fun `test one`() { val name = RandomStringUtils.randomNumeric(10) val id = Random.nextLong(100) val targetCreated = LocalDateTime.now().minusHours(48) val request = Request(name = name).apply { this.id = id } // 反射修改created属性 val createdField = Request::class.java.getDeclaredField("created") createdField.isAccessible = true createdField.set(request, targetCreated) // 验证赋值结果 assertEquals(targetCreated, request.created) }
方案二:封装通用反射工具函数
如果需要多次修改val属性,可以封装一个工具函数简化重复代码:
// 通用私有字段赋值工具 fun <T : Any> T.setPrivateField(fieldName: String, value: Any) { val field = this::class.java.getDeclaredField(fieldName) field.isAccessible = true field.set(this, value) } // 测试中调用工具函数 @Test fun `test one`() { val name = RandomStringUtils.randomNumeric(10) val id = Random.nextLong(100) val targetCreated = LocalDateTime.now().minusHours(48) val request = Request(name = name).apply { this.id = id this.setPrivateField("created", targetCreated) } assertEquals(targetCreated, request.created) }
注意事项
- 反射仅建议在单元测试场景使用,生产环境应避免(会破坏封装性和代码安全性)。
- 如果遇到字段名称匹配问题,可通过
javap -p Request.class命令查看编译后的类字段名,确保反射时使用的字段名正确。
内容的提问来源于stack exchange,提问作者Sajjjj
相关产品推荐
相关产品推荐

