테스트(Matchers.is) 질문드립니다.
576
작성한 질문수 10
.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(Matchers.is(2)))위 코드와 아래코드 모두 정상적으로 통과하는걸 확인하였는데요
.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(2))수업에서는 Matchers.is()를 사용하셨는데 위 코드 문맥에서 is()를 굳이 왜 사용하셨는지 궁금해서 질문드립니다.
답변 1
1
안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.
결론부터
적어주신 코드가 제가 작성한 코드와 살짝 다른데 아마도 아래 내용을 의미 하셨을 겁니다.
.andExpect(jsonPath("$.length()").value(1))
.andExpect(jsonPath("$.length()", Matchers.is(1))) // <- 요 부분결론만 우선 말씀드리면 위 예제에서의 검증은 같습니다. 제가 그냥 버릇같이 .value를 쓸때도 있고.. Matchers.is를 쓸때도 있고.. ㅋ
jsonPath 코드 내부를 보면 거의 동일한 로직을 태웁니다.
jsonPath(기대값, Matcher.is(1))
public static <T> ResultMatcher jsonPath(String expression, Matcher<? super T> matcher) { // JsonPathResultMatchers를 새로 만들고 그 안에서 내부적으로 jsonPathHelper를 새로 만들어 사용함. return (new JsonPathResultMatchers(expression, new Object[0])).value(matcher); }jsonPath(기대값).value(10)
public ResultMatcher value(@Nullable Object expectedValue) { return (result) -> { // jsonPathHelper를 사용함 this.jsonPathHelper.assertValue(this.getContent(result), expectedValue); }; }
그런데 말입니다.
jsonPath(기대값, Matcher)를 쓰면 편리한 부분이 있습니다.
코드에서 보시면 아시겠지만 두 번째 파라메터로 Matcher인터페이스를 구현하고 있는 녀석을 넣어줄 수 있습니다. 대표 적으로 org.hamcrest.Matchers 라는 클래스를 많이 이용합니다.
Matchers 클래스 안에는 Matcher 인터페이스를 구현한 녀석들을 많이 제공해줍니다. 대표적으로 Matchers.is가 그렇습니다. Matchers.is는 Is라는 Matcher 인터페이스를 구현한 녀석을 반환 해주는데요
코드는 아래와 같습니다.
public static <T> Matcher<T> is(Matcher<T> matcher) {
return Is.is(matcher); // Is라는 클래스는 Matcher를 구현하고 있음
}이 말 뜻은 무엇이냐. 너도 나도 Matcher 인터페이스를 구현해서 넣을 수 있다는 뜻 입니다. 검증 구현체를 잘 이용하면 조금 더 복잡한 케이스에 대해 검증할 수 있습니다.
당장 예를들면 아래와 같습니다.
// 간략히 적은 코드입니다.
jsonExpect([1,2,3]).value(1)위 코드는 1, 2, 3이 들어 있는 배열에 1이 포함되어 있는지 확인하려는 코드입니다. 그런데 value를 통해서는 검증을 할 수 없습니다. 그렇다고 contains와 같은 검증 메서드를 제공하지 않습니다. 그런데 Matcher를 이용하면 검증할 수 있습니다. Matcher를 직접 구현하지 않고 org.hamcrest 패키지에서 Matchers.contains를 이용하는거죠!
// 간략히 적은 코드입니다.
jsonExpect([1,2,3], Matchers.contains(1))위와 같이 검증을 진행할 수 있겠죠.
조금 더 복잡한 케이스에 대해서는 두 번째 파라메터로 Matcher 구현체를 넘길 수 있다. 대부분의 검증 케이스는 org.hamcrest.Matchers 안에 모셔두었으니 갔다 사용면 된다! 입니다.
감사합니다.
Deprecated 관련 사항들
0
104
2
깃헙 collaboator 초대 관련
0
89
1
강의 듣다가 도커 이미지 생성시 각각도 가능하나 그렇게 사용하는데가 많은지 모르겠다라는 말을 듣고 남김니다
0
157
2
logout 후에 login 페이지 이동은 어디서 시켜주는건가요?
0
233
1
다중 데이터를 삭제 할 때
0
271
2
querydsl Q class 이슈
0
415
2
Windows WSL Vue 설정
2
247
1
Dip, @transactional
0
189
1
[vite] http proxy error: /auth/login
0
1045
2
로그인 하고 나서 GET요청으로 메인페이지 요청
0
234
2
GitHub Collaborator 초대 관련
0
258
2
Window에서 Vue.js 설정
0
321
2
(솔루션 수정)'tsyringe' Error: TypeInfo not known for "클래스명"
0
713
2
collaboator로 초대받을 수 있을까요??
0
283
2
SecurityMockContext 로부터 유저 정보를 가져오기
0
262
1
given 부분이 길어질 때 어떻게 처리하면 좋을까요?
0
318
1
섹션9 프론트의 코드를 보고싶습니다,,,
0
423
1
Spring Security - defaultSuccessUrl 질문
0
627
1
강의 화면이 나오지 않습니다. 음성과 자막만 나와요
0
302
1
JPAQueryFactory(em)의 객체 생성자 오류에 대해서 질문이 있습니다ㅜㅜ
0
690
2
ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상
0
1182
2
섹션10 언제 나오나요?
0
485
1
CommentService에서 Repository를 호출하지 않는데도
0
343
1
Editor....를 활용한 패턴에 질문있습니다.
0
496
1





