我在特定情况下无法验证模式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$0.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$66.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$3.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$1.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$1.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$1.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$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.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$1.load(SchemaLoader.java:115)
at com.github.fge.jsonschema.core.load.SchemaLoader$1.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
答案 0 :(得分:-1)
看看这个answer
您的文件schemas.json/schema_cardapio_produto.json
似乎以非UTF-8编码存储。例如,以latin-1
或其他系统/操作系统默认编码
很难说为什么会这样,从剪贴板存储文件内容时可能使用了不同的文本编辑器。而且您需要save this file back into UTF-8
如果使用IntelliJ Idea IDE,则可以打开该json文件并check bottom right corner of text editor for actual encoding