# 240415 그룹 미션 #그룹 5 ## 테스트 코드 작성 - 스프링 부트에서 테스트 코드를 작성하는 방법을 확인해 본다. (1) 어떤 어노테이션이 있고 언제 사용하는지 확인해 본다. (2) 서비스 테스트에서 Repository에 대한 의존성을 없애고 싶을 때 무엇을 해야 할지 조사해서 정리한다. 웹 테스트 도구 설치 및 사용법 확인 아래 도구를 설치하고 사용법을 알아본다. (1) Postman (2) IntelliJ의 .http (3) SpringBoot의 테스트코드 -> RestTemplate (4) SpringBoot의 테스트 코드 -> WebTestClient (5) Httpie 테스트의 Assert와 같은 기능을 할 수 있는지도 확인해 본다. 댓글로 학습내용 요약 정리할 것! ## 실습 - @RunWith - Junit5로 넘어오면서 @ExtendWith로 - 단위 테스트에 공통적으로 사용할 확장 기능을 선언해 주는 역할 - SpringExtension이나 MockitoExtension 등이 있는데, 앞에 둘은 같이 쓰면 충돌하니 주의 - 상황에 맞게 쓰자 - @SpringBootTest : 통합 테스트를 위한 환경 준비 - 기본적으로 모든 빈을 탐색하고 등록 - 특정 계층만 테스트가 필요한 상황에서 불필요하게 무거워지고 오랜 시간이 걸림 - 슬라이스 테스트(Slice Test)를 위한 어노테이션도 제공 -> 역시 스프링 컨텍스트를 구성하므로 통합 테스트 - 이게 없으면 @Autowired 다 무용지물 - @WebMvcTest : 컨트롤러를 위한 테스트 (슬라이스 테스트) - 컨트롤러와 연관된 빈들만 제한적으로 찾아 등록 - @MockBean - 기존에 사용되던 스프링 Bean이 아닌 Mock Bean을 주입(껍데기만 가져오고 내부의 구현 부분은 모두 사용자에게 위임한 형태) - Bean의 이름 강제로 지정 x 시 어떤 Bean을 가져와야 할 지 알수 없어 오류 발생 - @Mock - Mock 객체 생성. 실제 메서드는 갖고 있지만 내부 구현이 없는 상태 - @Spy - 모든 기능을 가지고 있는 완전한 객체, stub하지 않은 메서드들은 원본 메서드 그대로 사용 - stub이란 다른 객체 대신 가짜 객체를 주입해 어떤 결과를 반환하라고 정해진 답변을 준비시킨 것 - @InjectMock - @InjectMocks라는 어노테이션을 사용한다면 해당 클래스가 필요한 의존성과 맞는 Mock 객체들을 감지하여 해당 클래스의 객체가 만들어질 때 사용하여 객체를 만들고 해당 변수에 객체를 주입하게 된다. - @SpyBean - MockBean과 다르게 선언한 코드 외에 전부 실제 객체의 것 사용 - 이미 존재하는 Bean을 SpyBean으로 Wrapping한 형태 - 사용법은 동일 - GPT 3.5 답변 ```text @MockBean과 @SpyBean은 스프링(Spring) 프레임워크에서 테스트를 위해 사용되는 주석(annotation)으로, 스프링 부트(Spring Boot) 테스트에서 주로 사용됩니다. 이 두 어노테이션은 모두 테스트 환경에서 사용되는 빈(bean)을 만드는데 사용되지만, 그 목적과 동작 방식이 조금 다릅니다. @MockBean @MockBean은 해당 빈을 모의 객체(mock object)로 대체합니다. 모의 객체는 실제 객체의 동작을 흉내 내지만, 실제 코드를 실행하지는 않습니다. 대신 테스트 작성자가 설정한 동작을 수행하게 할 수 있습니다. 예를 들어, 어떤 메서드의 반환값을 강제로 지정하거나, 해당 메서드가 호출되었는지를 검사하는 등의 용도로 사용됩니다. @MockBean을 사용하면 원래 스프링 컨텍스트에 등록된 빈이 모의 객체로 교체되어, 모든 의존성이 이 모의 객체를 주입받게 됩니다. @SpyBean @SpyBean은 기존의 빈을 감시 객체(spy object)로 감싸 사용합니다. 감시 객체는 실제 객체의 모든 실제 동작을 수행하지만, 특정 동작을 추적하거나 변경할 수 있는 추가적인 기능을 제공합니다. 예를 들어, 메서드 호출을 추적하거나, 메서드의 반환값을 변경하지 않고 호출 횟수만 확인하는 등의 작업이 가능합니다. @SpyBean은 실제 객체의 동작을 유지하면서도 필요에 따라 그 동작을 오버라이드할 때 유용합니다. 결론적으로, 테스트에서 완전히 독립적인 동작을 원할 때는 @MockBean을 사용하고, 기존 로직을 일부 유지하면서 감시하거나 수정할 필요가 있을 때는 @SpyBean을 사용하는 것이 적절합니다. ``` -> 주의사항 : SpyBean은 인터페이스 Bean 에서는 작동되지 않는다 (1.5.7 기준) repository를 SpyBean을 통해 테스트하려면 해당 테스트 범위가 너무 커지고 통합테스트와 다름 없는 테스트가 될 수 있다 Mock을 쓰는 걸 권장 2) 서비스 테스트에서 Repository에 대한 의존성 없애고 싶을 때? - ## 참고자료 - https://mangkyu.tistory.com/242 - https://jojoldu.tistory.com/226 - https://caffeineoverflow.tistory.com/143 - https://cobbybb.tistory.com/16 - stub vs mock ㅂㅈㄷㄷ1324 https://medium.com/daangn/%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EC%9C%84%ED%95%9C-stub-%EA%B0%9D%EC%B2%B4-%ED%99%9C%EC%9A%A9%EB%B2%95-5c52a447dfb7