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 - AlertDialog show = new AlertDialog.Builder(this) 未定义

Java swing 应用程序的外观和感觉在 netbean 和 eclipse 中显得不同

java - 对远程 Web 服务的 Spring Boot http 调用

java - Junit 4如何在测试套件中初始化并将其传递给测试类

java - 管理不同的资源目录

spring-boot - Spring 单元测试休息 Controller

java - Spring boot + jpa,通过表单提交进行多对多关联

java - PowerMockito 验证静态方法从未被调用

java - org.gradle.api.tasks.testing.junit.JUnitOptions.includeGroups() 适用于参数类型 : (java. lang.String) values: [NoDbTests]

java - 设置 AWT 列表中字符串的格式