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 테스트에 익숙하지않아 정확하게 알지는 못하지만.. 사용했을때 필요한 값, 필요없는 값을 정리하기 더 쉬워지는 것 같다. 정리되는 느낌.. 정확하지 않으니 참고만 하길 바란다.