Junit이란
단위테스트 도구.. 생각보다 맘처럼 안된다.
test class에서 구현하므로 기능추가 시 재사용이나 restdocs같은 문서화가능한 것들과 같이 쓰면 문서 공유도 할 수 있다.
기본 기능들
기본 기능들은 restdocs를 사용할 때 사용한 코드들로 예를 들겠다.
controller 테스트 시엔 mockmvc와 같이 사용한다.
이때 given, when, then 패턴과 같이 사용 할 수 있는데 보기가 편한 것 같고 이해하기 쉽게 짤 수 있는 것 같다.
- given
given에서는 테스트할 환경을 정의 해준다 어떤 파라미터를 넘기고 어떤 값을 받겠다는 정의를 할 수 있다.
예)String id = "id"; given(메소드(파라미터)).willReturn(테스트시 리턴값);
-
when when에선 언제, 즉 어떤 상태에서 어떤값을 가진 상태로 테스트할지 정의 할 수 있다.
어떤 http 메소드와 어떤 URL에서 무슨 파라미터를 넣고등 정의 할 수 있다.
Path 파라미터나 Request 파라미터등은 url에 ?name=~&phoneNumber=~ 처럼 파라미터를 넣어주는 것이 필요하다.final ResultActions testActions = mockMvc.perform(RestDocumentationRequestBuilders.get(serviceUrl+"/{id}", id) .contentType(MediaType.APPLICATION_JSON_UTF8) .content(objectMapper.writeValueAsString( TestDto.builder() .id("test") .name("test용") .build() )) ) ) .andDo(print());
-
then then에선 예상되는 결과값을 정의 할 수 있다.
여기서 예상되는 상태코드는 200이고 어떤 파라미터들을 request하고 path로 주고 response로 어떤 값을을 받는다 등의 정의를 한다.testActions .andExpect(status().isOk()) .andDo(this.document.document( pathParameters( // @PathVariable parameterWithName("id").description("아이디") ), requestParameters( //@RequestParam parameterWithName("name").description("이름"), parameterWithName("phoneNumber").description("전화번호") ) ) ) ; } responseFields( fieldWithPath("data").description("응답 데이터"), fieldWithPath("data.id").description("아이디"), fieldWithPath("data.password").description("비밀번호"), fieldWithPath("data.name").description("이름"), fieldWithPath("data.email").description("이메일"), fieldWithPath("data.phoneNumber").description(전화번호"), ) ) ) ;
- @before
- 테스트 클래스안의 메소드들이 테스트전에 실행될 코드들을 정의 해논다.
- @after
- 테스트 클래스안의 메소드들이 테스트 후 실행될 코드들이다.
service test
service test의 경우 integration test가 아닌경우 mock test를 할텐데 이때 repostory의 bean이 등록되지않았기 때문에
repository의 메소드들(findby~~, save등등)경우 override를 해줘야한다.
findByid등 사용할 메소드들을 정의 해줘야 한다.
간단한 CRUD 같은 기능은 mock test가 간단하고 편하지만 약간의 로직이 들어가거나 중복된다면
실제 db로 하는 integration test가 더 편한 것 같다
아직 junit 테스트에 익숙하지않아 정확하게 알지는 못하지만.. 사용했을때 필요한 값, 필요없는 값을 정리하기 더 쉬워지는 것 같다. 정리되는 느낌.. 정확하지 않으니 참고만 하길 바란다.