当前位置: 首页 > 知识库问答 >
问题:

H2集成测试数据库与MySQL prod DB命名不一致

於宾白
2023-03-14

我一直在编写一些使用内存(H2)数据库的集成测试,但我一直被这个错误所困扰。

原因:组织。h2.jdbc。JdbcSQLException:未找到表“TESTTABLE”;SQL语句:

问题是,在生产中,Hibernate正在将表名和列名从骆驼大小写更改为下划线。(TestTable-

下面是我的测试配置类:

@Configuration
@EnableJpaRepositories(basePackageClasses = {
    TestTableRepository.class
})
public class InMemoryDataConfig {

@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addDefaultScripts()
            .build();
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[]{"org.test.domain.entity"});

    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    em.setJpaProperties(buildHibernateProperties());

    return em;
}

protected Properties buildHibernateProperties() {
    Properties hibernateProperties = new Properties();

    hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
    hibernateProperties.setProperty("hibernate.show_sql", "true");
    hibernateProperties.setProperty("hibernate.use_sql_comments", "true");
    hibernateProperties.setProperty("hibernate.format_sql", "true");

    return hibernateProperties;
}

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}

@Bean
public TestService testService() {
    return new TestService();
}

}

我宁愿不必注释所有内容,这样测试就可以知道名称是什么。

对此有什么想法或建议吗?感谢您的任何帮助!

共有1个答案

娄丁雨
2023-03-14

这并没有完全回答我提出的具体问题,但我能够以一种更简单的方式让它工作。如果你把我在原始问题中发布的所有内容都删掉,你只需要做几件事。

首先,必须包含依赖项。我正在使用gradle,所以我添加了以下内容:

testCompile("com.h2database:h2:1.4.191")

接下来,将这些注释添加到测试中:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MultifamilyIntegrationTest {

    @Autowired
    protected TestService testService;

    @Test
    public void test() {
        testService.getUsers();
    }

}

最后,您必须在 /src/test/resources文件夹中包含data.sql和schema.sql文件。

schema.sql文件是所有与模式相关的创建脚本。

数据。sql文件用于插入所有需要的数据。

 类似资料:
  • 我有一个在mySQL上运行的小型数据库应用程序。 我想使用H2进行测试。 我向build.gradle添加了必要的依赖项: runtimeOnly’com。h2数据库:h2' 然而,我注意到,在完成测试之后,我的mySQL数据库包含测试期间生成的字段,就好像spring没有使用H2一样。 有什么问题吗?

  • 我正在开发一个使用MongoDB数据库的程序,但我在问,当通过Java执行SQL时,是否可以使用内部数据库进行测试,比如H2?

  • 问题内容: 是否有人对从集成测试框架(如Selenium)进行的回滚数据库事务的最佳实践或首选方式有任何建议? 这是当前的情况:我们有一个.net Web项目,其中包含许多在单元测试环境中可以正常工作的单元测试- 每个测试都继承一个父类,该父类在[SetUp]中打开一个事务,并在其中回滚该事务。 [TearDown]。每次测试后,我们的单元测试数据库都恢复到原始状态。 但是,一旦进入集成环境,情况

  • 我试图用H2测试我的JPA原生@查询。我的原生查询如下: 在编写单元测试时,我得到以下H2错误: 原因:org.h2.jdbc.jdbcsqlexception:找不到表“accounts”;SQL语句:从'aws_account_name'喜欢LOWER(CONCAT(“%”,COALESCE(?,“”),“%”))限制的帐户中选择*?[42102-197] 我可以通过更改SQL语法将表名置于双

  • 我有一组Junit测试用例。所有测试用例都必须针对不同的数据库环境执行。在junit测试中使用“@RunWith(SpringJUnit4ClassRunner.class)”时,Spring Boot应用程序只启动一次。但我需要用不同的配置重新启动应用程序,包括flyway迁移和其他与环境相关的应用程序-

  • 当我运行命令gradle war integrationTest时,集成测试失败,因为它在服务项目中找不到上下文侦听器。错误消息的片段如下: 对此我们非常感谢您的帮助。提前致谢