인프런 커뮤니티 질문&답변
테스트(Matchers.is) 질문드립니다.
작성
·
559
2
.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 안에 모셔두었으니 갔다 사용면 된다! 입니다.
감사합니다.






너무나 몸둘바를 모르게 자세하게 답변해주셔서 감사합니다!!