如何使用Mockito和Spring捕获mock repository操作的入参值
使用Mockito捕获Mock对象方法入参的实现方案
你可以通过Mockito提供的ArgumentCaptor(参数捕获器)实现这个需求,具体步骤如下:
1. 引入参数捕获器
首先在测试类中声明对应类型的参数捕获器,有两种实现方式:
注解方式(推荐)
- 给测试类添加Mockito注解支持:
JUnit5 需添加类注解@ExtendWith(MockitoExtension.class)
JUnit4 需添加类注解@RunWith(MockitoJUnitRunner.class) - 声明捕获器:
@Captor private ArgumentCaptor<Account> accountCaptor;
手动创建方式
无需额外类注解,直接在测试方法内创建捕获器:
ArgumentCaptor<Account> accountCaptor = ArgumentCaptor.forClass(Account.class);
2. 捕获方法入参并校验
在调用完业务方法后,先通过verify验证Mock的Repository的save方法被调用,同时用捕获器接住入参,之后就可以对捕获到的对象做断言校验。
修改后的完整测试代码如下:
@ExtendWith(MockitoExtension.class) // JUnit5环境添加这行 public class AccountServiceTest { @Mock AccountRepository accountRepository; @InjectMocks AccountService accountService; @Captor private ArgumentCaptor<Account> accountCaptor; @Test public void remove_staff_updates_roles() { Account account = new Account("username", "pass"); when(accountRepository.findByUsername(any(String.class))).thenReturn(Optional.of(account)); accountService.updateStaffStatusByUsername("user", false); // 捕获save方法的入参 verify(accountRepository).save(accountCaptor.capture()); // 拿到捕获到的待保存Account对象做断言 assertFalse(accountCaptor.getValue().getRoles().contains(Role.ROLE_STAFF)); } }
补充说明
- 如果
save方法被多次调用,可以用accountCaptor.getAllValues()拿到所有入参的List,按调用顺序取值校验即可 - Spring Boot项目默认的
spring-boot-starter-test依赖已经包含Mockito相关组件,无需额外引入依赖
内容的提问来源于stack exchange,提问作者Cameron McBroom
相关产品推荐
相关产品推荐

