2

可以在我有 @Sql 注释的地方编译 groovy 代码吗?

下面的代码是简单的测试,用 Spock 编写。

@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'); 插入 typ_zadania (id, kod) 值 (1, 'KOD'); 成为 @org.springframework.test.context.jdbc.Sql 中 java.lang.String 类型的内联常量

我认为带有美元符号的多行字符串被评估为 GString 对象,但语句字段是字符串数组的类型。

我可以在多行字符串中使用带有 java 注释常量的 groovy 代码吗?

4

1 回答 1

4

您面临的问题与多行字符串无关 - 编译器期望传递给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否则。

于 2018-12-24T20:44:18.743 回答