放心错误解析消息:"Invalid UTF-8 middle byte 0x20"

Rest Assured error parsingMessage: "Invalid UTF-8 middle byte 0x20"

我在特定情况下验证架构 json 时遇到问题,但我在其他测试用例中使用了此类似代码并且我成功了。以下是我无法成功验证架构的示例:

我使用的代码:

given()
    .header("Accept", "application/json")
    .header("Content-Type", "application/json")
    .header("TokenPass", tokken)
.when()
    .get(endpoint)
.then()
    .statusCode(200)
    .contentType(ContentType.JSON)
        .body(matchesJsonSchemaInClasspath("schemas.json/schema_cardapio_produto.json"));

和我的 json 架构,为“https://jsonschema.net/#/”生成。 我已经将此生成器用于其他测试用例并且我成功了。

  {
  "definitions": {}, 
  "$schema": "http://json-schema.org/draft-07/schema#", 
  "$id": "http://example.com/root.json", 
  "type": "array", 
  "title": "The Root Schema", 
  "items": {
    "$id": "#/items", 
    "type": "object", 
    "title": "The Items Schema", 
    "required": [
      "codigoSecaoProduto", 
      "idProduto", 
      "codigo", 
      "descricao", 
      "descricaoDetalhada", 
      "unidadeMedida", 
      "ordem", 
      "indisponivel", 
      "urlImagem", 
      "codigoEstruturaMercadologica", 
      "customizavel", 
      "comboVariavel", 
      "tipoItemConsumo", 
      "precoVenda", 
      "precoPromo", 
      "cardapioDigitalEstabelecimentoSecaoProdutoObsPreparo", 
      "cardapioDigitalEstabelecimentoSecaoProdutoComplementos", 
      "promocaoPremmia", 
      "etapasIngredientes"
    ], 
    "properties": {
      "codigoSecaoProduto": {
        "$id": "#/items/properties/codigoSecaoProduto", 
        "type": "string", 
        "title": "The Codigosecaoproduto Schema", 
        "default": "", 
        "examples": [
          "MV8xOF8x"
        ], 
        "pattern": "^(.*)$"
      }, 
      "idProduto": {
        "$id": "#/items/properties/idProduto", 
        "type": "integer", 
        "title": "The Idproduto Schema", 
        "default": 0, 
        "examples": [
          1207
        ]
      }, 
      "codigo": {
        "$id": "#/items/properties/codigo", 
        "type": "string", 
        "title": "The Codigo Schema", 
        "default": "", 
        "examples": [
          "22498663"
        ], 
        "pattern": "^(.*)$"
      }, 
      "descricao": {
        "$id": "#/items/properties/descricao", 
        "type": "string", 
        "title": "The Descricao Schema", 
        "default": "", 
        "examples": [
          "Mocha"
        ], 
        "pattern": "^(.*)$"
      }, 
      "descricaoDetalhada": {
        "$id": "#/items/properties/descricaoDetalhada", 
        "type": "string", 
        "title": "The Descricaodetalhada Schema", 
        "default": "", 
        "examples": [
          "CAFÉ MOCHA : ESPRESSO+LEITE VAPORIZADO+CALDA DE CHOCOLATE"
        ], 
        "pattern": "^(.*)$"
      }, 
      "unidadeMedida": {
        "$id": "#/items/properties/unidadeMedida", 
        "type": "string", 
        "title": "The Unidademedida Schema", 
        "default": "", 
        "examples": [
          "ML "
        ], 
        "pattern": "^(.*)$"
      }, 
      "ordem": {
        "$id": "#/items/properties/ordem", 
        "type": "integer", 
        "title": "The Ordem Schema", 
        "default": 0, 
        "examples": [
          1
        ]
      }, 
      "indisponivel": {
        "$id": "#/items/properties/indisponivel", 
        "type": "boolean", 
        "title": "The Indisponivel Schema", 
        "default": false, 
        "examples": [
          false
        ]
      }, 
      "urlImagem": {
        "$id": "#/items/properties/urlImagem", 
        "type": "string", 
        "title": "The Urlimagem Schema", 
        "default": "", 
        "examples": [
          "url/Media/BR/produto/79ce7f59-8c7b-44f5-b70b-c5bda28f18b3.jpe"
        ], 
        "pattern": "^(.*)$"
      }, 
      "codigoEstruturaMercadologica": {
        "$id": "#/items/properties/codigoEstruturaMercadologica", 
        "type": "integer", 
        "title": "The Codigoestruturamercadologica Schema", 
        "default": 0, 
        "examples": [
          959
        ]
      }, 
      "customizavel": {
        "$id": "#/items/properties/customizavel", 
        "type": "boolean", 
        "title": "The Customizavel Schema", 
        "default": false, 
        "examples": [
          false
        ]
      }, 
      "comboVariavel": {
        "$id": "#/items/properties/comboVariavel", 
        "type": "boolean", 
        "title": "The Combovariavel Schema", 
        "default": false, 
        "examples": [
          false
        ]
      }, 
      "tipoItemConsumo": {
        "$id": "#/items/properties/tipoItemConsumo", 
        "type": "string", 
        "title": "The Tipoitemconsumo Schema", 
        "default": "", 
        "examples": [
          "ProdutoSimples"
        ], 
        "pattern": "^(.*)$"
      }, 
      "precoVenda": {
        "$id": "#/items/properties/precoVenda", 
        "type": "number", 
        "title": "The Precovenda Schema", 
        "default": 0.0, 
        "examples": [
          5.5
        ]
      }, 
      "precoPromo": {
        "$id": "#/items/properties/precoPromo", 
        "type": "null", 
        "title": "The Precopromo Schema", 
        "default": null, 
        "examples": [
          null
        ]
      }, 
      "cardapioDigitalEstabelecimentoSecaoProdutoObsPreparo": {
        "$id": "#/items/properties/cardapioDigitalEstabelecimentoSecaoProdutoObsPreparo", 
        "type": "array", 
        "title": "The Cardapiodigitalestabelecimentosecaoprodutoobspreparo Schema"
      }, 
      "cardapioDigitalEstabelecimentoSecaoProdutoComplementos": {
        "$id": "#/items/properties/cardapioDigitalEstabelecimentoSecaoProdutoComplementos", 
        "type": "array", 
        "title": "The Cardapiodigitalestabelecimentosecaoprodutocomplementos Schema"
      }, 
      "promocaoPremmia": {
        "$id": "#/items/properties/promocaoPremmia", 
        "type": "array", 
        "title": "The Promocaopremmia Schema"
      }, 
      "etapasIngredientes": {
        "$id": "#/items/properties/etapasIngredientes", 
        "type": "array", 
        "title": "The Etapasingredientes Schema"
      }
    }
  }
}

这个Json是有效的,我用了几个Json验证器来验证。 我收到此错误:

com.jayway.restassured.module.jsv.JsonSchemaValidationException: com.github.fge.jsonschema.core.exceptions.ProcessingException: fatal: content at URI "file:/C:/Users/pedro.grazziani/eclipse-workspace/APITestesDigital/target/test-classes/schemas.json/schema_cardapio_produto.json#" is not valid JSON
    level: "fatal"
    uri: "file:/C:/Users/pedro.grazziani/eclipse-workspace/APITestesDigital/target/test-classes/schemas.json/schema_cardapio_produto.json#"
    parsingMessage: "Invalid UTF-8 middle byte 0x20"

    at com.jayway.restassured.module.jsv.JsonSchemaValidator.matchesSafely(JsonSchemaValidator.java:233)
    at com.jayway.restassured.module.jsv.JsonSchemaValidator.matchesSafely(JsonSchemaValidator.java:75)
    at org.hamcrest.TypeSafeMatcher.matches(TypeSafeMatcher.java:65)
    at org.hamcrest.Matcher$matches.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
    at io.restassured.assertion.BodyMatcher.validate(BodyMatcher.groovy:76)
    at io.restassured.assertion.BodyMatcher$validate[=13=].call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:138)
    at io.restassured.assertion.BodyMatcherGroup$_validate_closure2.doCall(BodyMatcherGroup.groovy:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:292)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
    at groovy.lang.Closure.call(Closure.java:423)
    at groovy.lang.Closure.call(Closure.java:439)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3167)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.collect(DefaultGroovyMethods.java:3137)
    at org.codehaus.groovy.runtime.dgm.invoke(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
    at io.restassured.assertion.BodyMatcherGroup.validate(BodyMatcherGroup.groovy:47)
    at io.restassured.assertion.BodyMatcherGroup$validate.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:138)
    at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:458)
    at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure$validate.call(Unknown Source)
    at io.restassured.internal.ResponseSpecificationImpl.validateResponseIfRequired(ResponseSpecificationImpl.groovy:643)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:207)
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:56)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:151)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:163)
    at io.restassured.internal.ResponseSpecificationImpl.content(ResponseSpecificationImpl.groovy:94)
    at io.restassured.specification.ResponseSpecification$content.callCurrent(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:151)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
    at io.restassured.internal.ResponseSpecificationImpl.body(ResponseSpecificationImpl.groovy:244)
    at io.restassured.internal.ValidatableResponseOptionsImpl.body(ValidatableResponseOptionsImpl.java:262)
    at api.testes.APITesteCardapio.consulta_um_produto_de_uma_secao_de_cardapio(APITesteCardapio.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
    at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: com.github.fge.jsonschema.core.exceptions.ProcessingException: fatal: content at URI "file:/C:/Users/pedro.grazziani/eclipse-workspace/APITestesDigital/target/test-classes/schemas.json/schema_cardapio_produto.json#" is not valid JSON
    level: "fatal"
    uri: "file:/C:/Users/pedro.grazziani/eclipse-workspace/APITestesDigital/target/test-classes/schemas.json/schema_cardapio_produto.json#"
    parsingMessage: "Invalid UTF-8 middle byte 0x20"

    at com.github.fge.jsonschema.core.load.URIManager.getContent(URIManager.java:110)
    at com.github.fge.jsonschema.core.load.SchemaLoader.load(SchemaLoader.java:115)
    at com.github.fge.jsonschema.core.load.SchemaLoader.load(SchemaLoader.java:109)
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3524)
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2317)
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2280)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3934)
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3938)
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4821)
    at com.github.fge.jsonschema.core.load.SchemaLoader.get(SchemaLoader.java:172)
    at com.github.fge.jsonschema.main.JsonValidator.buildJsonSchema(JsonValidator.java:210)
    at com.github.fge.jsonschema.main.JsonSchemaFactory.getJsonSchema(JsonSchemaFactory.java:224)
    at com.jayway.restassured.module.jsv.JsonSchemaValidator.matchesSafely(JsonSchemaValidator.java:221)
    ... 78 more

看看这个answer

您的文件 schemas.json/schema_cardapio_produto.json 似乎是以非 UTF-8 编码存储的。例如在 latin-1 或其他 system/OS 默认编码中

很难说为什么会这样,可能是在从剪贴板存储文件内容时使用了不同的文本编辑器。你需要 save this file back into UTF-8

如果您使用 IntelliJ Idea IDE,您可以打开该 json 文件并 check bottom right corner of text editor for actual encoding