我在 Spring Boot 中使用 Junit,以及 TestContainers (Docker、MySQL 8.0.29)开发集成测试。
当我单独执行测试时,它们都成功了。然而,当我同时运行它们时(即在 CI/CD 中),它们会失败。这是因为测试不是按顺序执行的,在执行查找项目的测试之前,项目可能已经被删除。
为了解决这个问题,我想为实体提供一个唯一的 ID。但是,该 ID 已在我的 Hibernate 实体中自动设置:
@Entity
public class Assignment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
我尝试在执行每个测试之前删除所有项目,但这不起作用:
@Autowired
private JdbcTemplate jdbcTemplate;
@BeforeEach
void tearDown() {
JdbcTestUtils.deleteFromTables(jdbcTemplate, "assignment");
}
集成测试示例:
@Test
void When_getById_Verify_Fields() {
AssignmentDTO assignmentDTO = new AssignmentDTO();
assignmentDTO.setTitle("test");
assignmentDTO.setDescription("test");
assignmentDTO.setUserId("1");
assignmentDTO.setCreator("1");
assignmentService.addAssignment(assignmentDTO);
AssignmentDTO expectedAssignment = assignmentService.getById(1);
assertEquals(assignmentDTO.getTitle(), expectedAssignment.getTitle());
assertEquals(assignmentDTO.getDescription(), expectedAssignment.getDescription());
assertEquals(assignmentDTO.getUserId(), expectedAssignment.getUserId());
assertEquals(assignmentDTO.getCreator(), expectedAssignment.getCreator());
}
最佳答案
每个测试方法通常应该删除它创建的数据以防止出现此问题。
如果您希望将数据不提交到数据库,您可以将 @Transactional
注释添加到测试方法或测试类中(如果您希望将其用于所有测试方法)。
这将在测试方法之后进行回滚。
关于java - 如何在使用 JUnit、Spring Boot 和 TestContainers 的集成测试中防止数据冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74488013/