작성
·
486
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 안에 모셔두었으니 갔다 사용면 된다! 입니다.
감사합니다.
너무나 몸둘바를 모르게 자세하게 답변해주셔서 감사합니다!!