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

如何用Mockito/Mockk verify校验内部创建的参数对象属性正确性

测试方案实现说明

Mockito 和 MockK 都完全支持该场景的参数属性校验需求,以下分别给出两种框架的实现方式:

Mockito 实现

方式1:使用 ArgumentCaptor 捕获参数后校验(推荐大多数场景使用)

  • 步骤1:声明对应参数类型的参数捕获器
    // 示例中参数类型为 ParameterObject,替换为你实际的参数类即可
    ArgumentCaptor<ParameterObject> paramCaptor = ArgumentCaptor.forClass(ParameterObject.class);
    
  • 步骤2:执行 verify 时用捕获器替代原有 any() 匹配器
    // test2Mock 是你注入到Test类中的Test2实例的mock对象
    verify(test2Mock).doAnotherThing(paramCaptor.capture());
    
  • 步骤3:获取捕获到的参数实例,校验内部属性
    ParameterObject realParam = paramCaptor.getValue();
    // 按需校验所有预期属性即可
    assertEquals("预期的属性值", realParam.getTargetAttr());
    assertEquals(100, realParam.getCountAttr());
    
    如果doAnotherThing被多次调用,可以调用paramCaptor.getAllValues()获取所有传入的参数列表逐个校验

方式2:自定义 ArgumentMatcher 实现匹配(适合校验逻辑复用场景)

  • 步骤1:实现参数匹配器,写入属性校验逻辑
    public class ExpectedParamMatcher implements ArgumentMatcher<ParameterObject> {
        // 存储预期的属性值
        private final String expectedAttr;
        private final int expectedCount;
    
        public ExpectedParamMatcher(String expectedAttr, int expectedCount) {
            this.expectedAttr = expectedAttr;
            this.expectedCount = expectedCount;
        }
    
        @Override
        public boolean matches(ParameterObject argument) {
            // 所有属性符合预期才返回匹配成功
            return expectedAttr.equals(argument.getTargetAttr()) 
                && expectedCount == argument.getCountAttr();
        }
    }
    
  • 步骤2:verify 时用argThat包装匹配器即可
    verify(test2Mock).doAnotherThing(argThat(new ExpectedParamMatcher("预期属性值", 100)));
    

MockK 实现

MockK 针对 Kotlin 场景做了语法简化,有两种常用实现方式:

方式1:使用 Slot 捕获参数后校验

// 声明存储参数的Slot,指定参数类型
val paramSlot = slot<ParameterObject>()
// 打桩时用capture捕获参数
every { test2Mock.doAnotherThing(capture(paramSlot)) } returns Unit // 替换为你实际的方法返回值

// 执行被测试的doSomething方法
testInstance.doSomething()

// 校验捕获到的参数属性
assertEquals("预期属性值", paramSlot.captured.targetAttr)
assertEquals(100, paramSlot.captured.countAttr)

方式2:直接在匹配规则中写校验逻辑(适合一次性校验场景)

// 执行被测试方法后直接verify,用match函数写属性匹配规则
verify { 
    test2Mock.doAnotherThing(match { 
        it.targetAttr == "预期属性值" && it.countAttr == 100 
    }) 
}

内容的提问来源于stack exchange,提问作者Hendry Steffens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:36:03