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

如何用Kotlin函数式编程访问属性,封装不可测逻辑适配单元测试

实现方案

你需要的逻辑在Kotlin中有两种常见实现方式,都可以实现视图逻辑和核心业务逻辑解耦,方便单元测试:

方案1:使用可写属性引用(匹配你伪代码的属性指针逻辑)

这种方案完全匹配你给出的伪代码逻辑,通过返回属性引用实现读写能力:

  1. 函数定义
import kotlin.reflect.KMutableProperty0

fun createMask(propertyProvider: () -> KMutableProperty0<String>, mask: String) {
    // 调用属性的set方法赋值
    propertyProvider().set(mask)
}
  1. 调用方代码
fun caller() {
    createMask(
        propertyProvider = {
            val ssnField: mywidgets.SSNField = findViewById(R.id.editTextText)
            // 返回hint属性的可写引用
            ssnField::hint
        },
        mask = "xxx-xx-xxx"
    )
}
  1. 单元测试示例
import org.junit.Test
import org.junit.Assert.assertEquals

class CreateMaskTest {
    @Test
    fun `verify mask is set correctly`() {
        var testHint = ""
        createMask(
            propertyProvider = { ::testHint },
            mask = "test-123"
        )
        assertEquals("test-123", testHint)
    }
}

方案2:无反射的Setter闭包方案(更轻量推荐)

不需要依赖Kotlin反射,性能更优,实现更简洁:

  1. 函数定义
fun createMask(mask: String, hintSetter: (String) -> Unit) {
    hintSetter(mask)
}
  1. 调用方代码
fun caller() {
    createMask("xxx-xx-xxx") { mask ->
        val ssnField: mywidgets.SSNField = findViewById(R.id.editTextText)
        ssnField.hint = mask
    }
}
  1. 单元测试示例
import org.junit.Test
import org.junit.Assert.assertEquals

class CreateMaskTest {
    @Test
    fun `verify mask is set correctly`() {
        var testHint = ""
        createMask("test-123") {
            testHint = it
        }
        assertEquals("test-123", testHint)
    }
}

内容的提问来源于stack exchange,提问作者Lance Kind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:06:03