Groovy интерполировать многострочную строку в Java-аннотации - PullRequest
0 голосов
/ 24 декабря 2018

Можно ли скомпилировать Groovy-код, где у меня есть аннотация @Sql с константой?

Приведенный ниже код представляет собой простой тест, написанный на Споке.

@Sql(statements = ["""
         INSERT INTO pracownik ($Fields.KOMPETENCJA_ID, nr_ewid) 
                                values (1, 'A');
         INSERT INTO typ_zadania (id, kod) values (1, 'KOD');
"""]
)
def "should add new qualification"() { 
  //test code omitted
}

Когда я хочу запустить тестметод получения ошибки при компиляции:

Groovyc: ожидаемые значения 'INSERT INTO pracownik ($ Fields.KOMPETENCJA_ID, nr_ewid) (1,' A ');INSERT INTO значения typ_zadania (id, kod) (1, 'KOD');быть встроенной константой типа java.lang.String в @ org.springframework.test.context.jdbc.Sql`

Я думаю, что многострочная строка со знаком доллара оценена для объекта GString, нооператоры fields является типом массива строки.

Можно ли использовать в коде Groovy константы Java-аннотации в многострочной строке?

1 Ответ

0 голосов
/ 24 декабря 2018

Проблема, с которой вы столкнулись, не имеет ничего общего с многострочным String - компилятор ожидает, что значение, переданное атрибуту statement, является встроенной константой.GString с интерполированными переменными не удовлетворяет этому ожиданию.Вы увидите точно такую ​​же ошибку компиляции, если напишите одну строку GString, которая содержит интерполированные значения из Fields поля класса.

Похоже, вы намеревались получить имя столбца, связанное с Fields.KOMPETENCJA_ID,Замените его ожидаемым значением, чтобы интерполяция не требовалась.Примерно так:

@Sql(statements = """
        INSERT INTO pracownik (kompetencja_id, nr_ewid) 
                               values (1, 'A');
        INSERT INTO typ_zadania (id, kod) values (1, 'KOD');
""")
def "should add new qualification"() {
    //test code omitted
}

Один интересный факт о Groovy.Двойная кавычка " обычно используется для обозначения типа GString.Тем не менее, Groovy-компилятор проверяет, содержит ли строка какие-либо переменные, например ${variableName}, для выполнения интерполяции.Если он находит, он использует GString в качестве типа и String в противном случае.

...