inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

게시글 조회 3 - 게시글 여러개 조회

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

576

falsystack

작성한 질문수 10

2

.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(Matchers.is(2)))

위 코드와 아래코드 모두 정상적으로 통과하는걸 확인하였는데요

.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(2))

수업에서는 Matchers.is()를 사용하셨는데 위 코드 문맥에서 is()를 굳이 왜 사용하셨는지 궁금해서 질문드립니다.

vue.js aws spring-boot jpa spring-security

답변 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 안에 모셔두었으니 갔다 사용면 된다! 입니다.

감사합니다.

0

falsystack

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

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