取决于数据库视图的集成测试

时间:2019-03-15 14:25:43

标签: sql-server hibernate elasticsearch junit h2

生产环境使用SQL Server,集成测试使用H2数据库。我们使用一个数据库视图,该视图连接了许多数据库列,其中一些使用STUFF函数在视图中创建其字段值。用于生产环境的数据库表是由Flyway脚本创建的,而用于集成测试的表是由Hibernate自动生成的,或者是在测试之前使用@SQL注释通过SQL脚本创建的。 STUFF函数不适用于H2方言,因此在运行测试类时无法生成视图。

以前尝试解决问题的方法

  1. ;MODE=MSSQLServer添加到为测试应用程序配置文件指定的属性中的databaseUrl属性中。
  2. 通过ALIAS定义一个虚拟函数,该函数将充当集成测试的STUFF函数。

这些尝试均无济于事。

问题:如何为H2数据库创建这样的视图?

背景信息:使用此视图以编程方式为Elasticsearch索引重新编制了索引。测试类在连接到视图中的适当表中设置数据,并为Elasticsearch索引测试数据的处理。

1 个答案:

答案 0 :(得分:1)

STUFF()只是更复杂表达的简写。这些产生相同的结果:

DECLARE 
  @expr  varchar(64) = 'hello there',
  @start int = 6,
  @chars int = 4,
  @repl  varchar(64) = 'bye';

SELECT STUFF(@expr,@start,@chars,@repl);

SELECT LEFT(@expr,@start-1) + @repl + SUBSTRING(@expr, @start + @chars, 64);

忽略1个字符的字符串和其他极端情况(例如长度超过10亿个字符的字符串)的错误处理,您可以创建一个为您抽象STUFF()的函数。在SQL Server系统上,该函数是:

CREATE FUNCTION dbo.StuffForMe
(
  @expr nvarchar(max),
  @start int,
  @chars int,
  @repl nvarchar(max)
)
RETURNS nvarchar(max)
WITH SCHEMABINDING
AS
BEGIN
  RETURN (SELECT STUFF(@expr,@start,@chars,@repl));
END
GO

在H2上:

CREATE FUNCTION dbo.StuffForMe
(
  @expr nvarchar(max),
  @start int,
  @chars int,
  @repl nvarchar(max)
)
RETURNS nvarchar(max)
WITH SCHEMABINDING
AS
BEGIN
  RETURN (SELECT LEFT(@expr,@start-1) + @repl 
    + SUBSTRING(@expr, @start + @chars, 1000000000));
END
GO

您的视图然后仅引用dbo.StuffForMe,因此不必在系统之间进行更改,您只需要分别部署两个不同版本的功能即可。