Интеграционный тест в зависимости от вида базы данных - PullRequest
0 голосов
/ 15 марта 2019

Производственная среда использует SQL Server, а интеграционные тесты - базу данных H2. Мы используем представление базы данных, которое объединяет несколько столбцов базы данных, некоторые из которых используют функцию STUFF для создания значений своих полей в представлении. Таблицы базы данных для производственной среды создаются скриптами Flyway, тогда как таблицы, используемые для интеграционных тестов, либо автоматически генерируются Hibernate, либо создаются с помощью скриптов SQL перед тестами с использованием аннотации @SQL. Функция STUFF недоступна для диалекта H2, и, следовательно, представления не могут быть созданы при запуске тестового класса.

Предыдущие попытки решения :

  1. Добавление ;MODE=MSSQLServer к свойству databaseUrl в свойствах, предназначенных для профиля тестового приложения.
  2. Определение фиктивной функции через ALIAS, которая будет выполнять функцию STUFF для интеграционных тестов.

Ни одна из этих попыток не сработала.

Вопрос : Как создать такое представление для базы данных H2?

Справочная информация : индекс Elasticsearch программно переиндексируется с использованием этого представления. Тестовый класс устанавливает данные в соответствующих таблицах, которые объединяются в представлении, и тестирует обработку данных для индекса Elasticsearch.

1 Ответ

1 голос
/ 15 марта 2019

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 символом и других крайних случаев, таких как строки длиной более 1 миллиарда символов, вы можете создать функцию, которая абстрагирует 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, поэтому не требуется переключаться между системамивам просто нужно развернуть две разные версии функций независимо друг от друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...