JsonFieldMatcher의 사용 #8
Closed
unikal1
started this conversation in
Show and tell
Replies: 3 comments
-
|
다른 의견 있으시면 말해주세요. |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
오... 장난 아니네요 사실 그동안 프로젝트 하면서 테스트 코드는 철저하게 챙기지 못해서 아는 바가 많지 않습니다. 쨌든 위 클래스 활용해서 mvc 테스트 추상화? 하는 건 아주 좋은 거 같습니다. |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
쌈뽕하네요 저도 저거 매 컨트롤러마다 테스트 하면서 무의미한 반복 코드 작성 계속 했던 기억이 있습니다 최고입니다 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
보통 json 응답에 대하여 이를 검증하기 위해서 다음과 같은 방식을 사용합니다.
다만, json 필드 안의 내용이 너무 많아지면 이를 검증하기 위한 코드가 너무 많아지기에, 해당 클래스를 사용하는게 어떨까요.
기존에 사용했던 코드이고, 현재 프로젝트 상황에 맞게 바꾸긴 했습니다. 예상치 못한 오류 발생 시 수정이 필요하긴 합니다.
코드 자체는 다음과 같은 목적을 위해 작동합니다.
정도가 있습니다. 음, 작동 방식은 저도 한번 정리할 겸, 최대한 적어보겠습니다.
작동 방식
테스트코드에서 사용하는
andExpect는ResultMatcher를 매개변수로 받습니다. 이때 jsonPath().value()는ResultMatcher의 구현체인JsonPathResultMatcher를 반환합니다.andExpect는 mockMvc에서 제공하는 함수형 인터페이스ResultActions에 속해있으며, 유일한 추상 메서드입니다.(그래서 함수형 인터페이스죠). 이에 대한 구현체 중 하나인MockMvc에는 다음과 같은 코드가 있습니다중요한 것만 보자면, 이는 perform 메서드의 반환 정의 부분이며, andExpect를 하게 되면, 매개변수로 받은 ResultMatcher의 match 메서드를 호출하는 것을 볼 수 있습니다. 당연히 모든 ResultMatcher의 구현체는 해당 메서드를 오버라이드 하도록 강제되어 있습니다. 즉, 일반적인 흐름은 다음과 같습니다.
jsonPathHelper.assertValue를 통해 값을 검증합니다. 결론적으로, "실질적인 값의 비교" 는 여기서 진행한다고 보면 됩니다.)이제 제가 작성한 코드를 보겠습니다. override 된
match메서드는 내부 필드인List<ResultMatcher> matchers에 대하여, 각각에 대해 match 메서드를 실행합니다.hasStatus는 ResultMatcher가 함수형 인터페이스이기 때문에,
람다식을 이용하여 match(result) 메서드를 즉석에서 구현한 익명 구현체를 반환합니다.
결국, result -> { ... } 람다는 match(MvcResult)의 구현이며,
andExpect(...) 내부에서 호출되어 실제 테스트 검증을 수행하게 됩니다.
hasKey메서드는 일종의 팩토리 메서드 패턴의 메서드 역할이며, 자기 자신을 반환합니다. 이때, 앞서 말했던 List 에 값을 넣고, 인스턴스를 생성하여 반환합니다. 모든 ResultMatcher는 사실상 MockMvcResultMatchers.jsonPath에서 반환되는 값이며, 여기서의 match 메서드를 실질적으로 사용합니다.hasKey 메서드에서 몇몇가지 사유로 인하여 (대표적으로 직렬화, 날짜 변환 문제) 이를 해결하기 위한 코드도 존재합니다. 다만 이는 직관적으로 명시가 되어 있으니 코드를 참조해주세요.
Beta Was this translation helpful? Give feedback.
All reactions