如何使用MockK模拟局部变量,自定义AtomicReference/Metadata返回值
模拟
headers.get().keys().size返回指定值的实现方案 不需要刻意模拟AtomicReference,它本身仅作为线程安全的容器类,你只要控制它持有的Metadata实例的keys()方法返回值,即可自定义目标判断条件的结果。以下是两种常用实现方案:
方案1:依赖注入改造(无需Mock框架)
对原有业务代码做最小幅度的可测试性改造,将Metadata实例改为方法可选注入参数,默认值保留原有逻辑不影响线上运行:
class Foo() { // 新增可选入参metadata,默认值保持原有初始化逻辑 suspend fun bar(metadata: Metadata = Metadata()) { val headers = AtomicReference(metadata) val currentMetadata = headers.get() if (currentMetadata.keys().size > 0) { // ... 原有业务逻辑 } } }
测试时直接构造符合要求的Metadata实例传入即可,示例如下:
// 测试代码中构造自定义返回的Metadata实例 val testMetadata = object : Metadata() { override fun keys(): Set<String> { // 自定义返回集合大小,比如需要size=1就返回1个元素的集合 return setOf("test_key") } } // 调用测试方法 Foo().bar(testMetadata)
方案2:使用MockK框架Mock(无需修改原有业务代码)
如果你不想调整原有业务代码,可以使用Kotlin生态常用的MockK测试框架,直接Mock内部构造的Metadata实例的返回值:
- 先在测试依赖中引入MockK组件
- 测试代码示例:
import io.mockk.every import io.mockk.mockkConstructor import kotlinx.coroutines.test.runTest import org.junit.Test class FooTest { @Test fun testBarLogic() = runTest { // Mock所有Metadata构造出来的实例 mockkConstructor(Metadata::class) // 指定keys()方法返回固定大小的集合,比如此处设置size=2 every { anyConstructed<Metadata>().keys() } returns setOf("key1", "key2") // 直接调用业务方法即可,内部的Metadata会返回预设值 Foo().bar() } }
内容的提问来源于stack exchange,提问作者Trumango
相关产品推荐
相关产品推荐

