• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

테스트(Matchers.is) 질문드립니다.

23.06.28 15:36 작성 조회수 389

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 코드 내부를 보면 거의 동일한 로직을 태웁니다.

  1. 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);
    }
  2. 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.isIs라는 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 안에 모셔두었으니 갔다 사용면 된다! 입니다.

감사합니다.

falsystack님의 프로필

falsystack

질문자

2023.06.29

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