【问题标题】:Mockito, how to verify if the method of the tested class was called?Mockito,如何验证是否调用了测试类的方法?
【发布时间】:2021-08-24 20:11:33
【问题描述】:

我想检查是否在方法执行期间调用了 toDishResponseDTO。但这是不可能的,因为这是正在测试的类的方法。如何做到这一点?

    @ExtendWith(MockitoExtension.class)
class DishServiceTest {
    @Mock
    DishRepository dishRepository;
    @Mock
    RestaurantRepository restaurantRepository;


    @Autowired
    @InjectMocks
    DishService dishService;

待测方法

    public List<DishResponseDTO> getAll() {
    List<Dish> dishlsit = dishRepository.findAll();
    return dishlsit.stream()
            .map(this::toDishResponseDTO)
            .collect(Collectors.toList());
}

测试

    @Test
void shouldCallFindAllReturnDto_whenV() {
    Mockito.when(dishRepository.findAll()).thenReturn(TestData.ENTITY_DISH);
    dishService.getAll();
    Mockito.verify(dishRepository, times(1)).findAll();
    Mockito.verify(dishService times(6)).toDishResponseDTO(any()); // compile error, because verify can be called only on mocks
}

【问题讨论】:

    标签: java spring mockito


    【解决方案1】:

    您将无法使用 Mockito 来验证该方法是否被调用,但您可以验证 getAll() 方法的输出,因为您已经模拟了对 dishRepository.findAll() 的响应。因此,实际上,只需在验证调用后添加一些断言,以使您的预期数据与实际数据相匹配,我假设 this::toDishResponseDTO 只返回一个 Dish

    @Test
    void shouldCallFindAllReturnDto_whenV() {
       Mockito.when(dishRepository.findAll()).thenReturn(TestData.ENTITY_DISH);
       List<Dish> dishes = dishService.getAll();
       Mockito.verify(dishRepository, times(1)).findAll();
       assertThat(dishes, is(notNullValue());
       assertThat(dishes.get(0).getSomeField, is(equalTo("someValue")));
    }
    

    【讨论】:

    • 谢谢,我所有的 Service 方法都返回 toDishResponseDTO() 的结果,我认为如果我可以检查是否调用了该方法会很好。并检查 toDishResponseDTO() 一次,而不是检查每个方法。可惜少了这么好用的功能
    • 如果这是您必须做的事情,您可以查看 PowerMock,它能够执行您想要的验证。但请记住,您真正想要测试的是您的公共方法,并且它们正在产生所需的输出,验证响应数据涵盖了这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多