Spy对象即使存根也会继续调用真实方法



我正在对这个服务方法进行单元测试,这需要在正在测试的同一类中使用其他方法。因此,我已经阅读了spy并将其应用到我的代码中。然而,即使在存根时,我正在测试的类的spy对象也会继续执行真正的方法。

正在测试的方法

@Override
public CategoryResponseDto updateCategory(Long categoryId, UpdateCategoryRequestDto requestDto) {
CategoryEntity categoryEntity = findById(categoryId);
modelMapper.convertToEntity(requestDto, categoryEntity);
categoryEntity = categoryRepository.save(categoryEntity);
return modelMapper.convertToResponse(categoryEntity, CategoryResponseDto.class);
}

我的测试代码

@Test
public void updateCategory_ShouldReturnCategoryResponseDto_WhenDataValid() {
CategoryEntity categoryEntity = mock(CategoryEntity.class);
UpdateCategoryRequestDto requestDto = mock(UpdateCategoryRequestDto.class);
CategoryCrudServiceImpl spy = Mockito.spy(categoryCrudService);
CategoryResponseDto expectedResult = mock(CategoryResponseDto.class);
doReturn(categoryEntity).when(spy).findById(anyLong());
when(categoryRepository.save(categoryEntity)).thenReturn(categoryEntity);
when(modelMapper.convertToResponse(categoryEntity, CategoryResponseDto.class)).thenReturn(expectedResult);
CategoryResponseDto result = categoryCrudService.updateCategory(1L, requestDto);
assertThat(result, is(expectedResult));
}

所以这里被测试的类是CategoryCrudServiceImple,这个类的实例在我的测试代码中是categoryCrudService,我从中创建了一个间谍spy(categoryCrudService)。正如你所看到的,我stub了findById(),它来自与doReturn(categoryEntity).when(spy).findById(1L);相同的CategoryCrudServiceImple类,它不起作用,我尝试在any()anyLong()中传递,真正的findById()方法仍然被调用,并抛出ResourceNotFound的异常。

你能帮我一下吗?我有什么遗漏或误解吗?

非常感谢您的宝贵时间。

好吧,多亏了上面@Tom的评论,我设法把它弄对了,因为我没有在这里使用间谍CategoryResponseDto result = categoryCrudService.updateCategory(1L, requestDto);。它应该是这样的CategoryResponseDto result = spy .updateCategory(1L, requestDto);.

最新更新