java - 如何在使用 JUnit、Spring Boot 和 TestContainers 的集成测试中防止数据冲突?

标签 java spring-boot junit testcontainers

我在 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/

相关文章:

java - 在android项目中包含非android项目(lib或类路径)

java - hibernate 中延迟加载对象属性的限制

java - 可插入类型检查器和检查器框架,真的需要所有这些设置吗?

spring-boot - 如何使用 flyway 和单数据库处理模块化 Spring 项目

java - spring test\Junit - 跳过测试配置

java - 仅从 Actor Libgdx 底部拖放触发器

java - java.util.logging 和锁定文件的问题

java - 如何在不同主机上向 eureka-server 注册 eureka-clients。 Spring Boot

java - 如何在单个浏览器中运行多个 UI 测试?

Android 测试用例顺序