@SpringBootTest自动装配库无法将数据保存到真实数据库中

时间:2019-12-21 16:53:38

标签: unit-testing spring-data-jpa repository in-memory-database spring-boot-test

我尝试使用真实数据库(不是内存数据库)进行单元测试。  这是我的配置文件:

@TestConfiguration
@EnableJpaAuditing
public class TestConfig {

  @Bean
  @Primary
  public DataSource getDataSource() {
    HikariDataSource hikariDataSource = new HikariDataSource();
    hikariDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/faptv");
    hikariDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    hikariDataSource.setUsername("mansion");
    hikariDataSource.setPassword("mansion");
    return hikariDataSource;
  }
}

这是我的示例测试:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ContextConfiguration(classes = {TestConfig.class})
@DirtiesContext
@Transactional
public class BaseEntityTest {
  @Autowired
  private TBL120Dao dao;

  @Test
  @Sql("classpath:/sql/abc.sql")
  public void test() {
    TBL120Dto dto = new TBL120Dto();
    dto.setUserId("xxx");
    dto.setUsername("ccsc");
    dto.setPasswordHash("passss");
    dao.save(dto);
    assertThat(dao.findByUserId("kkk").isPresent()).isTrue();
  }
}

这是我的/sql/abc.sql

insert into tbl120(user_id, password_hash, username) value ("kkk", "ssss", "Ssss");

测试完成后: 我在真实的数据库中看到:它有来自sql的新行。 但是它没有测试方法中具有userId'xxx'的行。并且,当我在测试方法中调试时,当我尝试执行dao.findAll()时,它仅存在一次userId'xxx'记录(请注意,在实际数据库中不存在此记录,实际数据库仅从sql中退出数据),它可以无法访问真实数据库。

如何保存和选择真实数据库中的数据?

1 个答案:

答案 0 :(得分:0)

Spring事务测试默认自动回滚。有关如何自定义此设置,请参见the documentation