Groovy在Java注释中插值多行字符串

时间:2018-12-24 19:40:28

标签: java groovy compiler-errors jvm spock

是否可以在具有@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代码吗?

1 个答案:

答案 0 :(得分:3)

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