如何用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实例:
然后让Repository返回这个Spy对象,调用方法后同样可以用@Spy private Category spyCategory = new Category();verify来验证参数。 - 要是需要更灵活的参数验证(比如检查参数非空、包含特定字符),还可以用Mockito的参数匹配器,比如
Mockito.eq()(精确匹配,其实默认就是这个)、Mockito.contains()等,不过你这里要精确匹配的话,直接传值就足够了。
这样就能准确确认category.setName()确实是以categoryData.getName()的准确值作为参数被调用的啦!
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

