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

如何用Mockito验证Spring Boot服务中Mock对象的setter方法调用及参数正确性?

验证category.setName()方法的调用参数

完全可以!Mockito提供了非常直观的方式来验证对象方法的调用参数,正好能满足你的需求。下面是具体的实现步骤和示例代码,帮你搞定这个验证:

1. 准备Mock对象

首先,你需要在测试类里正确Mock CategoryRepository,同时还要创建一个可被验证的Category实例——因为原方法里的category是从Repository返回的,所以我们可以Mock这个Category对象,让Repository返回它,这样就能追踪它的方法调用了。

示例代码:

@ExtendWith(MockitoExtension.class)
class CategoryServiceTest {

    @Mock
    private CategoryRepository categoryRepository;

    // Mock一个Category实例,用来追踪方法调用
    private Category mockCategory = Mockito.mock(Category.class);

    @InjectMocks
    private CategoryService categoryService; // 注入Mock到待测试的服务类
}

2. 配置Repository的返回值

接下来,让categoryRepository.findById()返回我们刚才Mock的Category实例,这样待测试的updateCategory方法就会使用这个Mock对象进行操作:

@Test
void updateCategory_ShouldSetExpectedName() {
    // 准备测试数据
    long testCategoryId = 1L;
    CategoryData testCategoryData = new CategoryData();
    String expectedName = "Updated Category Name";
    testCategoryData.setName(expectedName);

    // 配置Repository返回Mock的Category
    Mockito.when(categoryRepository.findById(testCategoryId))
           .thenReturn(Optional.of(mockCategory));

    // 调用待测试的服务方法
    categoryService.updateCategory(testCategoryId, testCategoryData);

3. 验证setName的调用参数

这一步就是核心了,用Mockito.verify()来检查mockCategory.setName()是否被调用,并且传入的参数正好是categoryData.getName()的精确值:

// 验证setName方法被调用了一次,且参数是我们预期的name
    Mockito.verify(mockCategory, Mockito.times(1))
           .setName(expectedName);
    // 或者直接用categoryData.getName()也可以,效果一样
    // Mockito.verify(mockCategory).setName(testCategoryData.getName());
}

额外小技巧

  • 如果你不想完全Mock Category,而是想用真实的对象同时验证方法调用,可以用@Spy来包装真实的Category实例:
    @Spy
    private Category spyCategory = new Category();
    
    然后让Repository返回这个Spy对象,调用方法后同样可以用verify来验证参数。
  • 要是需要更灵活的参数验证(比如检查参数非空、包含特定字符),还可以用Mockito的参数匹配器,比如Mockito.eq()(精确匹配,其实默认就是这个)、Mockito.contains()等,不过你这里要精确匹配的话,直接传值就足够了。

这样就能准确确认category.setName()确实是以categoryData.getName()的准确值作为参数被调用的啦!

内容的提问来源于stack exchange,提问作者Robert Strauch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:32:38