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
相关产品推荐
相关产品推荐

