首页 > 解决方案 > 集成测试值插入数据库

问题描述

我正在尝试使用 Spring Boot 集成测试来测试 JpaRepository。我正在使用没有嵌入式数据库的 @DataJPATest 注释。我正在使用与开发相同的 MySQL 数据库来运行集成测试。

@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
class UserRepositoryTest {

    @Autowired
    UserRepository userRepository;

    @Test
    void findByUsername() {
        User u = new User();
        u.setUsername("ML");
        u.setFirstname("Micheal");
        u.setLastname("Lane");
        u.setActive(true);
        userRepository.save(u);
        assertThat(userRepository.findByUsername("M21")).isNotNull();
    }
}

我在测试中插入的值被插入到实际的数据库中。但我认为使用@DataJpaTest 事务会在测试结束时回滚。

默认情况下,使用 @DataJpaTest 注释的测试是事务性的,并在每个测试结束时回滚。他们还使用嵌入式内存数据库(替换任何显式或通常自动配置的数据源)。@AutoConfigureTestDatabase 注释可用于覆盖这些设置。

那么为什么我的数据会保存到数据库中呢?是因为我没有使用嵌入式数据库吗?

使用的方言:spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

****************************************************** ********8

一旦我从测试方法中删除 findByUsername() 部分,它就开始回滚

 User u = new User();
        u.setUsername("ML");
        u.setFirstname("Micheal");
        u.setLastname("Lane");
        u.setActive(true);
        userRepository.save(u);
        //assertThat(userRepository.findByUsername("M21")).isNotNull();

所以我猜它不起作用,因为有 2 个查询。我将不得不使用已保存的数据进行 findByUsername() 测试

标签: spring-bootintegration-testing

解决方案


我相信这是由于自动接线。当您自动连接时,它通过依赖注入实例化接口。如果您不想在运行测试时存储数据,我建议您查看mockito。在那里您可以模拟存储库,以便您可以测试存储数据时使用的所有方法,但从不实际保存它


推荐阅读