【发布时间】:2023-03-20 17:20:02
【问题描述】:
我有以下测试,它会生成带有公司 ID 和电子邮件的邀请。然后,我们使用相同的公司 ID 和电子邮件生成第二个。这应该违反数据库的唯一约束(参见邀请实体)。事情是,测试通过了,如下所示(我猜第二次插入的事务永远不会提交)
如果我在第二次插入后执行findAll()(请参阅下面的评论),我会在findAll() 发生索引违规的那一行得到一个异常。
如何使UserService 中的方法在方法返回时提交其事务,以便测试代码按原样抛出异常?
@RunWith(SpringRunner.class)
@DataJpaTest
public class UserServiceTest {
... Everything is autowired
@Test
public void testCreateInvitation() {
String email = "test2@example.com";
Company company = userService.createCompany("ACMETEST", tu);
assertTrue(invitationRepository.count() == 0l);
assertNotNull(userService.sendInvitation(company, email));
assertTrue(invitationRepository.count() == 1l);
assertTrue(invitationRepository.findAllByEmail(email).size() == 1);
// Second should throw exception
userService.sendInvitation(company, email);
// If this line is uncommented, I get key violation exception, otherwise, test passes!!!!????
//Iterable<Invitation> all = invitationRepository.findAll();
}
邀请类和约束:
@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"email", "company_id"}))
@JsonIdentityInfo(generator= ObjectIdGenerators.PropertyGenerator.class, property="id")
@Data
public class Invitation {
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
String id;
@ManyToOne
@JoinColumn(name="company_id")
private Company company;
String email;
Date inviteDate;
Date registerDate;
}
用户服务:
@Service
@Transactional(propagation = Propagation.REQUIRES_NEW)
public class UserService {
public Invitation sendInvitation(Company company, String toEmail) {
Invitation invitation = new Invitation();
invitation.setCompany(company);
invitation.setInviteDate(new Date());
invitation.setEmail(toEmail);
try {
// TODO send email
return invitationRepository.save(invitation);
} catch (Exception e) {
LOGGER.error("Cannot send invitation: {}", e.getMessage());
}
return null;
}
}
【问题讨论】:
-
您在测试中使用的是哪个数据库?
-
h2,spring boot 默认
-
再次检查是否确实对数据库进行了约束。
-
确实如此,如果我取消注释下面的查询,请参阅有关抛出唯一约束违规异常的部分...
-
遇到同样的问题 -> stackoverflow.com/questions/52697057/…
标签: java spring spring-boot spring-data-jpa