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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:45:07