You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit重复手机号测试用例执行失败求助

JUnit重复手机号测试用例执行失败求助

看起来你搞反了这个测试的预期逻辑啦!

你现在用assertDoesNotThrow(),是在断言添加重复手机号的候选者时不会抛出任何异常,但你的数据库里已经存在相同手机号的记录(从错误提示里的唯一约束UK_9i5yt1gvm0chg5e10qkns7tll能看出来),所以执行candidateDAO.create(candidate)时必然会抛出约束违反的异常,这就导致你的测试断言失败——因为实际情况和你断言的“不抛出异常”完全相反。

正确的做法应该是用assertThrows()来验证当添加重复手机号时,系统确实抛出了对应的异常,这才符合数据库唯一约束的业务逻辑要求。

给你修改后的测试代码示例:

@Test
@Order(3)
void createCandidate_DuplicatePhone_Test() {
    Candidate candidate = Candidate.builder()
            .fullName("Name")
            .dateOfBirth(LocalDate.of(2001, 10, 1))
            .gender(Gender.MALE)
            .graduationYear(LocalDate.of(2023, 10, 10))
            .phone("999999999") // 该手机号已在前置测试中存入数据库
            .email("somemail@gmail.com")
            .skill("java")
            .foreignLanguage("English")
            .level(6)
            .cv("Good")
            .allocationStatus(1)
            .remark("Not Bad")
            .build();

    // 断言会抛出约束违反相关异常,可根据实际抛出的异常类型调整
    assertThrows(ConstraintViolationException.class, () -> candidateDAO.create(candidate));
    // 如果DAO层把JPA异常包装成了自定义异常,就替换成对应的自定义异常类
    // assertThrows(DuplicatePhoneException.class, () -> candidateDAO.create(candidate));
}

另外还有两个细节需要注意:

  • 确保在这个测试执行前(比如@Order(1)或@Order(2)的测试用例),已经成功创建了手机号为999999999的Candidate记录,这样重复添加时才会触发数据库的唯一约束校验。
  • 如果你的异常是被包装过的(比如Hibernate的ConstraintViolationException被转换成了JPA的PersistenceException),需要调整assertThrows里的异常类型,或者捕获外层异常后验证内部的异常原因。

备注:内容来源于stack exchange,提问作者Xjodia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 07:40:27