HTTP REST를 통해 통신하는 Spring Boot 서비스를 위해 Citrus Framework를 사용하여 통합 테스트를 작성했습니다.
@isNumber()@
항상 변경되는 타임 스탬프 와 같은 상황을 처리하기 위해 일부 Citrus 유효성 검사 "방법"을 JSON에 포함 할 수있었습니다 . 그러나 다른 사람을 시도했을 때 문제가 발생했습니다.
commandID
UUID를 포함하고 한 호출에서 다른 호출로 변경 될 가능성 이있는 다른 필드 ( )가 JSON에 있습니다. 처음 @match("<regex>")@
에는 UUID 패턴을 일치시키기 위해 사용하기로 결정했고 문제가 발생했을 때를 사용하려고 전환 @ignore@
했지만 동일한 문제가 발생했습니다.
다음은 콘솔의 오류입니다.
13:29:21.962 [main] ERROR com.consol.citrus.report.LoggingReporter - TEST FAILED MissionPlannerIT.testPlanMission <edu.mit.ll.mission_services.service.mission_planner> Nested exception is:
com.consol.citrus.exceptions.TestCaseFailedException: Validation failed: Values not equal for header element 'Accept', expected 'application/json' but was 'application/json,application/*+json'
여기에 문제가 무엇인지, 해결 방법도 모르겠습니다.
gen-route-command.json :
{
"header": {
"timestamp": "@isNumber()@",
"typeID": "edu.mit.ll.mission_services.messages.GenerateRouteCommand",
"transaction": {
"id": 1,
"startTime": "@isNumber()@"
},
"signature": {
"algorithm": null,
"keySize": 0,
"keyValue": null,
"sender": null
}
},
"commandID": "@ignore@",
"commandType": "GENERATE_ROUTE"
}
@isNumber()@
기능이 작동하고 이러한 요소들의 매칭이 검증을 통과 할 수있다. @ignore@
그러나 그렇지 않습니다. 두 가지 변형을 모두 시도했습니다. @ignore@
및 @ignore()@
, 둘 다 작동하지 않습니다. 앞서 언급했듯이 @match(...)@
는 작동하지 않습니다.
업데이트 :
테스트 케이스 코드에서 유효성 검사를 시도하도록 수정했습니다. JSON의 값을 다시 UUID로 변경했습니다.
runner.http(builder -> builder
.server(routeGeneratorServer)
.receive()
.post("/v1/missionServices/missionPlanning/generateRoute")
.accept(ContentType.APPLICATION_JSON.getMimeType())
.payload(new ClassPathResource("templates/gen-route-command.json"))
.validate("$.commandID", "@ignore@"));
gen-route-command.json :
{
"header": {
"timestamp": "@isNumber()@",
"typeID": "edu.mit.ll.mission_services.messages.GenerateRouteCommand",
"transaction": {
"id": 1,
"startTime": "@isNumber()@"
},
"signature": {
"algorithm": null,
"keySize": 0,
"keyValue": null,
"sender": null
}
},
"commandID": "0710d523-43da-4f68-90c7-a2b4544a955d",
"commandType": "GENERATE_ROUTE"
}
불행히도 이것은 작동하지 않습니다. 원래 @ignore@
또는 로 완화하려고했던 오류가 발생합니다 @match(...)@
.
14:12:57.299 [main] ERROR com.consol.citrus.report.LoggingReporter - TEST FAILED MissionPlannerIT.testPlanMission <edu.mit.ll.mission_services.service.mission_planner> Nested exception is:
com.consol.citrus.exceptions.TestCaseFailedException: Failed to validate JSON text:
{"header":{"timestamp":1581016372132,"typeID":"edu.mit.ll.mission_services.messages.GenerateRouteCommand","transaction":{"id":1,"startTime":1581016372130},"signature":{"algorithm":null,"keySize":0,"keyValue":null,"sender":null}},"commandID":"9302ebde-894b-43a3-b7a3-92a158c7170e","commandType":"GENERATE_ROUTE"} Values not equal for entry: 'commandID', expected '0710d523-43da-4f68-90c7-a2b4544a955d' but was '9302ebde-894b-43a3-b7a3-92a158c7170e'
commandID
는 새로운 UUID 각 실행을 생성하기 때문에 값이 다릅니다.
테스트의 유효성 검사가 값을 "무시"하지 않고 대신 JSON 유효성 검사가 UUID 차이에 플래그를 지정하는 것으로 보입니다.
JSON에 포함 된 Citrus "기능"이 문제가 아닌 것 같습니다. 문제는 Citrus 수신 호출에 대해 서비스가 게시하는 메시지에서 Accept
및 Content-Type
헤더를 설정하지 않았다는 것 입니다. 수신 호출이 메시지 유형을 찾도록 설정 application/json
되었으므로 내 메시지에 헤더가 전혀 없기 때문에 실패했습니다 (이는 내 인상입니다).
감귤류 호출 :
// Set route generator to receive and validate generate route command.
runner.http(builder -> builder
.server(routeGeneratorServer)
.receive()
.post("/v1/missionServices/missionPlanning/generateRoute")
.accept(ContentType.APPLICATION_JSON.getMimeType())
.payload(new ClassPathResource("templates/gen-route-command.json")));
수신 한 "generate route command"메시지에 헤더가 정의되어 있지 않습니다. Accept
및 Content-Type
헤더를로 설정하면 application/json
테스트를 진행할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다