Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

관리자 API를 제외한 전체에 대한 문서화 테스트를 작성한다. #553

Closed
Tracked by #273
woowahan-pjs opened this issue Jul 7, 2022 · 4 comments · Fixed by #571
Closed
Tracked by #273
Assignees
Labels
기능 New feature or request

Comments

@woowahan-pjs
Copy link
Contributor

woowahan-pjs commented Jul 7, 2022

3일

@SuyeonChoi
Copy link
Contributor

UserRestController 제외 남은 문서화 테스트

ApplicationFormRestControllerTest : 5개,
AssignmentRestControllerTest : 4개 (1개 테스트코드 없음)

@woowahan-pjs
Copy link
Contributor Author

woowahan-pjs commented Aug 9, 2022

다른 프로젝트 스니펫 디렉토리 이름의 예

  • GET /actuator/caches -> caches/all
  • GET /actuator/caches/cities -> caches/named
  • DELETE /actuator/caches -> caches/evict-all
  • DELETE /actuator/caches/countries?cacheManager=anotherCacheManager -> caches/evict-named
  • GET /users -> list-users
  • GET /foo -> getAllFoos
  • GET /foo/{id} -> getAFoo
  • POST /api/events/ -> create-event
  • GET /v1/units/{id} -> units-find
  • GET /v1/units -> units-find-all
  • GET /users -> users/getUserByName

스니펫 디렉토리 명명 규칙

${리소스 이름}(-list)-${템플릿 변수를 제외한 리소스 뒤의 경로}-${HTTP 요청 메서드}(-${HTTP 응답 상태})

  • 디렉토리 이름은 소문자로 작성한다.
  • IntelliJ IDEA AsciiDoc 플러그인을 통해 자동 완성하기 쉬워야 한다.
  • 목록을 조회할 때 복수형을 사용하는 대신 리소스 이름 뒤에 'list'를 추가한다.
  • HTTP 응답 상태 코드는 2xx인 경우 생략할 수 있다.

e.g.

디렉토리 이름 HTTP 요청 HTTP 응답
recruitment-item-list-get GET /api/recruitments/{id}/items 200 OK
user-reset-password-post-forbidden POST /api/users/reset-password 403 Forbidden

@woowahan-pjs
Copy link
Contributor Author

문제

스프링 부트 2.3.3에서 MockMultipartHttpServletRequestBuilder를 사용하여 테스트할 때 POST 메서드의 요청만 가능하며 405 Method Not Allowed가 발생하여 테스트가 실패한다.

해결 방법

  1. 핸들러 메서드의 애너테이션을 @PostMapping으로 변경한다.
  2. 스프링 부트 버전을 2.6.10 이상으로 올린다.
    • 스프링 부트 버전을 업그레이드하더라도 MockMvcExtensions가 지원하지 않기 때문에 코틀린 DSL을 사용할 수 없다.
    • https://github.com/spring-projects/spring-framework/pull/28634
  3. 자바 리플렉션 API를 사용한다.

원인

  • StandardServletMultipartResolver는 여러 요청 메서드를 지원하기 전에 POST 메서드만 지원했다.
  • 따라서 POST 메서드가 MockMultipartHttpServletRequestBuilder에 하드 코딩되어 있다.
// 5.2.x
// MockMultipartHttpServletRequestBuilder.java#L61-L64
MockMultipartHttpServletRequestBuilder(String urlTemplate, Object... uriVariables) {
    super(HttpMethod.POST, urlTemplate, uriVariables);
    super.contentType(MediaType.MULTIPART_FORM_DATA);
}

참고 자료

  • https://github.com/spring-projects/spring-framework/issues/21513

@woowahan-pjs
Copy link
Contributor Author

woowahan-pjs commented Aug 15, 2022

success()의 반환 타입이 ResultMatcher였기 때문에 실패할 것으로 예상했던 테스트가 통과했다.

content { json(objectMapper.writeValueAsString(this.success(response))) }

this.success(response)objectMapper에 의해 "{}"로 변환되었으며, 그 결과 아래 코드가 테스트되었다.

content { json("{}") }

json()에서 비교 모드는 strict 매개 변수로 설정할 수 있다. (기본값은 false)
테스트가 통과하는 이유는 strictfalse이기 때문이다.

  • true: strict checking. Not extensible, and strict array ordering.
  • false: lenient checking. Extensible, and non-strict array ordering.
  • false인 경우 지정된 속성에 대해서만 값을 비교하고 추가 속성은 확인하지 않는다. 또한 배열의 요소 순서에 영향을 받지 않는다.
  • true의 경우 지정된 속성 이외의 속성이 없어야 하며 배열의 요소 순서가 정확해야 한다. 속성의 순서에는 영향을 받지 않는다.
content { json("{}", false) } // pass
content { json("{}", true) } // fail

stricttrue로 바꿔도 기존 테스트가 깨지거나 속도가 느려지는 특별한 현상이 없으므로 true로 지정해도 좋을 것 같다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
기능 New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants