컨트롤러 단위 테스트 작성 방법 #76
sangwonsheep
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
컨트롤러 단위 테스트 방법
컨트롤러 테스트 시 해당 어노테이션들이 필요합니다.
해당 어노테이션들을 붙이지 않으면 생기는 문제에 대해서는 아래에 작성하겠습니다.
@MockBean에는 실제 Controller에서 스프링에 의해 주입받는 객체들을 적어주면 됩니다.그 후 테스트할 메서드에 대해 작성해주면 됩니다.
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;mockMvc.perform(get())get()는MockMvcRequestBuilders를 import 하시면 됩니다!실제 컨트롤러와 테스트 코드는 같은 로직을 실행해야만 합니다.
그렇지 않았을 때 생기는 문제는 아래에 타임리프 문제에 작성되어 있습니다.
Service Test와 마찬가지로
when().thenReturn()을 통해서 객체를 만들어줘야 합니다.JPA metamodel empty 문제
JPA metamodel과 관련된 많은 에러들이 발생하게 됩니다.
발생하는 이유는 스프링을 띄우고 테스트하는 것이 아니기 때문에 JPA 엔티티 및 관련 빈들이 제대로 로드되지 않아서 입니다.
이를 해결할 수 있는 방안은 총 2가지가 있습니다.
@SpringBootTest사용@MockBean(JpaMetamodelMappingContext.class)사용1번의 경우 통합 테스트로 진행되어 모든 빈들을 주입 받을 수 있기 때문에 편리하다는 장점이 있습니다. 제가 원하는 테스트는 단위 테스트이기 때문에 1번 방식은 이용하지 않았습니다.
제가 해결한 방법은 2번을 사용해서 해결하였습니다.
이렇게 하면 가장 빠르게 해결할 수 있지만 올바른 방법인지는 모르겠습니다.
시큐리티 설정 문제
시큐리티 설정이 되어 있기 때문에 401 에러가 발생합니다.
이를 해결하기 위해서는 테스트 코드에서 시큐리티 비활성화가 필요합니다.
타임리프 문제
hourResponse의 openTime이 null이 들어가는 문제가 계속해서 발생합니다.
log, debug를 통해서 알아본 결과, 실제 controller 부분의 hourResponse 객체 자체가 null로 나타납니다.
테스트 코드에서 hourResponse는 null이 아닌 객체 생성이 제대로 이루어져 있습니다.
Thymeleaf로 값을 제대로 변환해서 넘기지 못하는 문제인 줄 알고, 다른 코드를 고치는데 많은 시간을 소요하였습니다.
결론은 mocking이 제대로 이루어지지 않았던 것입니다.
그 이유는 컨트롤러에 있는 코드를 그대로 가져와서 테스트해야 하는데 그렇지 않았기 때문입니다.
컨트롤러에서 현재 요일을 가져오는 로직을 테스트 코드에 작성하지 않아 mocking이 제대로 이루어지지 않았던 것입니다.
[잘못된 방식]
이렇게 mocking을 하니까 제대로 값이 넘어가지 않았던 것입니다.
[올바른 방식]
위와 같이 mocking을 하면 null이 아닌 제대로 된 객체가 설정됩니다.
주의! 반드시 테스트 코드에 컨트롤러의 로직을 정확하게 반영해야 합니다!
컨트롤러에 작성한 처리 로직 그대로 테스트 코드에 작성해야 합니다!!!
테스트 코드와 실제 코드 간의 동작 차이를 최소화해야 합니다.
만약 테스트 코드에서 DayOfWeeks를 수동으로 설정한다면, 컨트롤러와 테스트 코드 간에 dayOfWeek 값이 일치하지 않아 모킹된 메서드가 올바르게 동작하지 않을 수 있습니다. → null이 들어갈 수 있음.
Beta Was this translation helpful? Give feedback.
All reactions