如何用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
相关产品推荐
相关产品推荐

