【问题标题】:Spring Boot component test with SQL query使用 SQL 查询的 Spring Boot 组件测试
【发布时间】:2018-02-04 00:48:02
【问题描述】:

我正在尝试为 sql 查询设置组件测试。为了处理我使用 myBatis 的 SQL。

我有一个正在创建嵌入式 H2 数据库的测试数据源配置。这适用于任何简单的查询。

我的问题是我的查询使用了 H2 不支持的 SQL 公用表表达式 (NOLOCK)。

我可以让 H2 忽略 NOLOCK 部分或替换 junit 测试期间使用的查询字符串吗?

myBatis 映射器看起来像这样:

public interface CoolMapper {
    @Results(...)
    @Select("SELECT * FROM cool_table WITH (NOLOCK)")
    List<CoolObject> getThings();
}

数据源配置: @配置 公共类 TestingDataSourceConfig {

    public TestingDataSourceConfig() {}

    @Profile("test")
    @Bean(name = "dataSources")
    @Primary
    @Qualifier(DataSourceConfig.DATA_SOURCES)
    public Map<UUID, DataSource> dataSources() {
        Map<UUID, DataSource> dataSourceMap = new HashMap<>();
        UUID uuid = UUID.fromString("dac46f50-a1fb-3434-b262-0c0c4564b117");

        EmbeddedDatabase database = new EmbeddedDatabaseBuilder().generateUniqueName(true)
                .setType(EmbeddedDatabaseType.H2)
                .setScriptEncoding("UTF-8")
                .ignoreFailedDrops(true)
                .addDefaultScripts()
                .build();

        dataSourceMap.put(uuid, database);

        return dataSourceMap;
    }
}

【问题讨论】:

  • 有人做了一个custom build of H2,在查询中丢弃了 SQLServer 表提示(WITH 子句),但该项目已有几年历史了。如果您的应用程序应该从其他事务中读取未提交的数据(这实际上是WITH (NOLOCK) 的意思),那么您需要一个真正的 SQLServer 实例来进行测试。

标签: java sql spring-boot junit mybatis


【解决方案1】:

有时您只需要一个真正的运行时环境,例如这里您需要一个专有数据库。在这些情况下,不要尝试将其作为单元测试。将其作为验收/系统测试的一部分进行 - 即,一旦部署到您的开发(或 QA,等等)服务器,您在应用程序上运行的测试。

【讨论】:

  • 我以为会是这样,但想在放弃之前看看周围
  • @steve 你必须问自己“我实际上在测试什么”。不要费心测试您的数据库是否知道关键字 NOLOCK 的含义。可以相信它确实如此。
  • 我同意,如果我能在使用测试配置文件时找到一种方法用 H2 兼容的选择替换那些静态 SQL 字符串,我会准备好的。
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2019-01-18
  • 2016-12-22
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
相关资源
最近更新 更多