【问题标题】:JPA Unit Test Case Delete Operation Wanted but not InvokedJPA 单元测试用例删除操作需要但未调用
【发布时间】:2019-04-09 08:47:45
【问题描述】:

我在尝试使用 JPA 创建用于删除的 junit 测试用例时遇到了一些问题。在我的服务类中,我使用的是 JPA 提供的默认功能:

public void delete(Long id) {
        log.debug("Request to delete Enroll : {}", id);
        enrollRepository.deleteById(id);
}

然后我的单元测试,我试图模拟一个对象,然后执行删除:

@Test
public void testDeleteEnrollExpectSuccess() {
    Enroll enroll = prepareEnrollWithBedAllocation();
    enrollService.delete(enroll.getId());
    verify(enrollRepository, times(1)).delete(enroll);
}

我很想像这样模拟注册对象:

private Enroll prepareEnrollWithBedAllocation() {
    LocalDateTime localDateTime = LocalDateTime.now();
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"));

    Enroll enroll = new Enroll();
    enroll.setId(new Long(1));
    enroll.seteDate(zonedDateTime);
    enroll.setEbStartdt(zonedDateTime);
    enroll.setEbEnddt(zonedDateTime);
    enroll.setBed(prepareBed());
    enroll.setPatient(preparePatient());
    enroll.setDoc(prepareDoc());
    enroll.seteCondition("Normal");
    return enroll;
}

但是,我收到了这些错误消息并且我的测试用例失败了:

Wanted but not invoked:
enrollRepository.delete(
    Enroll{id=1, eCondition='Normal', eRemarks='null', ebStartdt='2019-04-09T16:40:32.703Z[UTC]', ebEnddt='2019-04-09T16:40:32.703Z[UTC]', eDate='2019-04-09T16:40:32.703Z[UTC]'}
);
-> at com.team.generated.service.EnrollServiceTest.testDeleteEnrollExpectSuccess(EnrollServiceTest.java:61)

However, there was exactly 1 interaction with this mock:
enrollRepository.deleteById(1L);
-> at com.team.generated.service.EnrollService.delete(EnrollService.java:74)

有什么想法吗?谢谢!

【问题讨论】:

    标签: java unit-testing jpa mockito


    【解决方案1】:

    错误不言自明:您正在验证方法delete(Long id)

    verify(enrollRepository, times(1)).delete(enroll);
    

    但是,您的服务对象调用deleteById() 方法:

    enrollRepository.deleteById(id);
    

    我想你想这样做:

    @Test
    public void testDeleteEnrollExpectSuccess() {
        Enroll enroll = prepareEnrollWithBedAllocation();
        enrollService.delete(enroll.getId());
        verify(enrollRepository, times(1)).deleteById(enroll.getId());
    }
    

    【讨论】:

    • 我可以和你确认一下你有更新单元测试的例子吗?
    • @hyperfkcb,不,但它以相同的方式完成。只是不要混淆正在执行的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多