如何用Kotlin函数式编程访问属性,封装不可测逻辑适配单元测试
实现方案
你需要的逻辑在Kotlin中有两种常见实现方式,都可以实现视图逻辑和核心业务逻辑解耦,方便单元测试:
方案1:使用可写属性引用(匹配你伪代码的属性指针逻辑)
这种方案完全匹配你给出的伪代码逻辑,通过返回属性引用实现读写能力:
- 函数定义
import kotlin.reflect.KMutableProperty0 fun createMask(propertyProvider: () -> KMutableProperty0<String>, mask: String) { // 调用属性的set方法赋值 propertyProvider().set(mask) }
- 调用方代码
fun caller() { createMask( propertyProvider = { val ssnField: mywidgets.SSNField = findViewById(R.id.editTextText) // 返回hint属性的可写引用 ssnField::hint }, mask = "xxx-xx-xxx" ) }
- 单元测试示例
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反射,性能更优,实现更简洁:
- 函数定义
fun createMask(mask: String, hintSetter: (String) -> Unit) { hintSetter(mask) }
- 调用方代码
fun caller() { createMask("xxx-xx-xxx") { mask -> val ssnField: mywidgets.SSNField = findViewById(R.id.editTextText) ssnField.hint = mask } }
- 单元测试示例
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
相关产品推荐
相关产品推荐

