用于匹配json的任何scalatest匹配器

时间:2017-12-12 05:23:14

标签: json scala scalatest matcher

我的测试目前希望匹配测试中的方法转换的json字符串。我构造了一个期望的字符串来执行匹配。

val input = Foobar("bar", "foo")
val body = Foobar("bar !!", "foo!!")
val responseHeaders = Map[String, String]("Content-Type" -> "application/json")
val statusCode = "200"
val responseEvent = ResponseEvent(input, body, responseHeaders, statusCode)

val expected ="{\"input\":{\"foo\":\"bar\",\"bar\":\"foo\"},\"body\":{\"foo\":\"bar !!\",\"bar\":\"foo!!\"},\"headers\":{\"Content-Type\":\"application/json\"},\"statusCode\":\"200\"}"

val result = Main.stringifyResponse(responseEvent)

result should be(expected)

字符串匹配非常敏感,并且在任何空格上都失败,也不接受任何在多行上写的字符串,因为结果只能在一行上使用json4s库进行字符串化。

是否有更好的方法在json输出上执行匹配,而无需使用scalatest进行完整的字符串比较。

有没有更好的方法来创建此测试?

2 个答案:

答案 0 :(得分:1)

你有两个选择!

  1. 使用像Play Json这样的库,您可以将原始Json字符串打包到JsObject中,并使用Scalatest进行检查。如果您已经使用了JSON库,请查看是否可以利用它!

  2. 将您的JSON装入案例类并检查是否相等!

答案 1 :(得分:0)

结帐https://github.com/stephennancekivell/scalatest-json

libraryDependencies += "com.stephenn" %% "scalatest-json-jsonassert" % "0.0.3"
libraryDependencies += "com.stephenn" %% "scalatest-json4s" % "0.0.2"
libraryDependencies += "com.stephenn" %% "scalatest-play-json" % "0.0.1"
libraryDependencies += "com.stephenn" %% "scalatest-circe" % "0.0.1"

自JSON以来,它使您无需关心空白就可以编写测试。

    it("should pass matching json with different spacing and order") {
      val input = """
        |{
        | "some": "valid json",
        | "with": ["json", "content"]
        |}
      """.stripMargin

      val expected = """
                    |{
                    | "with": ["json", "content"],
                    |     "some":   "valid json"
                    |}
                  """.stripMargin

      input should matchJson(expected)
    }