You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:25:37