【问题标题】:Grails - JSONBuilder - Spec toPrettyString() returns stackoverflowGrails - JSONBuilder - Spec toPrettyString() 返回 stackoverflow
【发布时间】:2015-05-29 20:11:14
【问题描述】:

我正在做一个需要返回 JSON 的单元测试。为了构建它,我使用来自 JSONBuilder 的 toPrettyString() 方法。

这是要规范的类:

class Lugar {
   String sigla
   String nombre
   Coordenada coordenada

   String toString(){
      "${sigla}"
   }

   String toJson()
   {
      new JsonBuilder( this ).toPrettyString()
   }

   static constraints = {
      nombre blank: false , nullable: false
   }
}

要运行的规范是这样的:

@TestFor(Lugar)
class LugarSpec extends Specification {

    void "toJson not empty"() {

        when:
        Lugar lugar = new Lugar(sigla: "BUE", nombre:"BUENOS AIRES")
        String aux = lugar.toJson();

        then:
        ! aux.dump().empty
    }
}

但结果是:

 <error type="java.lang.StackOverflowError">java.lang.StackOverflowError
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1270)
    at groovy.lang.MetaBeanProperty.getProperty(MetaBeanProperty.java:60)
    at groovy.lang.PropertyValue.getValue(PropertyValue.java:40)
    at groovy.json.JsonOutput.writeObject(JsonOutput.java:287)
    at groovy.json.JsonOutput.writeMap(JsonOutput.java:421)
    at groovy.json.JsonOutput.writeObject(JsonOutput.java:291)
    at groovy.json.JsonOutput.writeArray(JsonOutput.java:326)
    at groovy.json.JsonOutput.writeObject(JsonOutput.java:283)
    at groovy.json.JsonOutput.writeMap(JsonOutput.java:421)
    at groovy.json.JsonOutput.writeObject(JsonOutput.java:291)
    at groovy.json.JsonOutput.writeArray(JsonOutput.java:326)
    at groovy.json.JsonOutput.writeObject(JsonOutput.java:283)
    at groovy.json.JsonOutput.writeMap(JsonOutput.java:421)
    at groovy.json.JsonOutput.writeObject(JsonOutput.java:291)

它会不断重复直到结束。

我尝试在 main 上测试 toJson,结果很好:

static void main(String[] args) {
    Lugar lugar = new Lugar(sigla: "BUE", nombre:"BUENOS AIRES")

    String aux = lugar.toJson();

    println aux.dump()
}

结果是:

{
    "sigla": "BUE",
    "constraints": {
        "nombre": {
            "blank": false,
            "nullable": false
        }
    },
    "nombre": "BUENOS AIRES"
}

【问题讨论】:

    标签: json unit-testing grails


    【解决方案1】:

    我不会让对象本身负责格式化它的内容。 首先,您可能会查看 @ToString 注释,它允许您指定要包含在结果中的字段。

    http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/ToString.html

    其次,我会删除 toJson 方法,让默认的 json 转换器处理它。就像是 println new JsonBuilder(object).toPrettyString()

    见: Groovy - Convert object to JSON string

    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多