我正在对这个服务方法进行单元测试,这需要在正在测试的同一类中使用其他方法。因此,我已经阅读了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);
.