[Spring] 단위테스트 @InjectMocks 사용방법
·
Spring/테스트 코드
단위테스트에서 @InjectMocks, @Mock, @Spy에 대한 것을 알아봤다.📌 서론요즘 개발하면서 단위 테스트를 많이 작성하는데 갑작스레 궁금증이 생겼다.단위 테스트에서는 주로 @SpringBootTest가 아니라 @InjectMocks를 사용하는데 이 애노테이션의 이름만 보면 "Inject + Mocks = 목 객체들을 주입한다." 이렇게 해석되는데 이것도 객체에 Mock을 주입하는 거니까 스프링의 의존성 주입과는 뭐가 다를지 알아보고 싶었다. 이렇게 시작된 궁금증으로 직접 단위 테스트를 작성해 보면서 주로 보게 되는 @InjectMocks, @Mock, @Spy 이것들의 관계성을 알아봤다. 또한 테스트 과정에서 인터페이스는 @Mock을 사용해야 했는데 왜 @Spy는 사용할 수 없는지 이것에 ..
[Spring] 예외 테스트의 중요성: 바인딩 오류
·
Spring/테스트 코드
예외 테스트를 왜 작성해야 하는지 경험한 내용을 공유하고자 한다. 📌 서론 내가 겪은 3가지 문제와 이것의 해결과정을 설명하고자 한다. 1. 안드로이드에서 데이터를 requestDto로 잘 보냈는데 스프링 서버에서는 null로만 받는 문제 발생 2. 1번 문제를 해결했더니 데이터 validation 문제 발생 3. 테스트 코드를 작성했는데 왜 이런 문제들이 발생한 걸까? 1. 첫 번째 문제: 데이터를 null로 받음 문제의 코드 아래의 컨트롤러 코드에 데이터를 보내면 모두 null을 받았다. @RequestMapping("/recipe") @RequiredArgsConstructor @RestController public class RecipeLikeController { private final Re..
Spring 통합테스트: Validation 문제 해결과 깊은 고민
·
Spring/테스트 코드
validation을 사용하여 dto 코드를 작성하고 통합테스트를 진행하던 도중 처음 겪는 문제에 직면했다. 📌 서론 통합테스트에서 "사용자가 잘못된 값을 입력해서 보내면 적절한 예외가 발생한다." 이런 bad 케이스 테스트를 작성하고 실행했다. 이때 예외가 발생해야 테스트가 성공하는데 내가 작성한 테스트에서는 예외가 발생하지 않았다. 그래서 나는 가장 먼저 사용자로부터 데이터를 받아오는 dto객체를 살펴봤다. 나는 dto 객체 내부에 Integer타입을 받는 변수를 선언해 주고 spring-validation의 기능을 적용하여 @Min(0)을 적어줬는데 이렇게 해주면 음수(-) 값이 들어왔을 때 검증에 의해 예외가 발생한다. 이렇게 열심히 세팅한 후 테스트를 진행했다. 그런데 보기 좋게 테스트에 실패했..
[Spring] 테스트: @ParameterizedTest 사용방법
·
Spring/테스트 코드
@ParameterizedTest를 사용하여 테스트 효율성을 높여보자 📌 서론 이번 포스트에서는 @ParameterizedTest를 사용해서 다양한 입력 값에 대한 테스트를 진행하는 방법을 살펴볼 것이다.이 방법으로 테스트 코드를 작성하는 것은 실제로 유효성 검사 같은 것들을 할 때 매우 유용하다. 지금부터 @ParameterizedTest를 사용하지 않을때와 사용할때를 비교해 보면서 왜 이 어노테이션을 통해 입력 값에 대한 테스트를 하는게 좋은지 비교해 보자 1. 테스트하려는 도메인의 비즈니스 로직 이해하기 먼저, 우리가 테스트할 도메인의 비즈니스 로직은 외부에서 validateBasicInfo() 메서드를 호출하면 내부에 담겨있는 변수들을 검증하는 로직이다. 이 메서드는 각 필드가 null이나 빈 문..
[Spring] 테스트 코드: @MockBean/@SpyBean 사용방법
·
Spring/테스트 코드
테스트 코드에서 @MockBean과 @SpyBean을 사용해서 이벤트 리스너 검증을 해보자 📌 서론 이전 포스트에서 열심히 스프링 이벤트 리스너에 대한 테스트 코드를 작성하고 검증했다. 나는 이 2가지 리스너 테스트를 한번에 성공시키고 싶어서 코드를 그대로 합쳐서 테스트를 진행했다. 그런데 테스트에서 오류가 발생했고 이것을 고치는데 생각보다 오랜 시간이 걸렸다. 그 이유는 테스트 코드에 대한 이해가 부족했기 때문인데 특히 @MockBean과 @SpyBean을 함께 사용할 때, 이 두 어노테이션이 어떻게 상호 작용하는지에 대한 이해가 부족했다. 지금부터 이 포스트에서는 두 가지 접근 방식을 비교하면서, 스프링 이벤트 리스너의 반응과 내부 동작을 어떻게 동시에 검증할 수 있는지 내가 겪은 내용을 토대로 설..
[Spring] 테스트 코드: @SpyBean으로 @EventListener 검증하기
·
Spring/테스트 코드
이번에는 스프링 이벤트 리스너의 내부 동작 테스트 코드를 통해 검증해 보자 📌 서론 이벤트 기반 아키텍처로 백엔드 개발을 진행할 때 이벤트 리스너가 호출되면 내부에서 작성했던 코드가 제대로 동작하는지 테스트하는 것은 애플리케이션의 정확성을 보장하는 데 굉장히 중요하다. 특히, 이벤트 리스너가 이벤트를 받아서 내부에서 어떤 처리를 하는지 확인하는 것이 중요하다. 이번 포스트에서는 RecipeCreationEvent 이벤트가 발행될 때 saveIngredientsIntoMongo 메서드의 내부에서 동작하는 메서드를 검증해 보자 저번 포스트에 이어지는 내용이니 보고 오시는 것을 추천합니다.👇🏻👇🏻 [Spring] 테스트 코드: @MockBean으로 @EventListener 검증하기 테스트 코드를 통해 스프링..
[Spring] 테스트 코드: @MockBean으로 @EventListener 검증하기
·
Spring/테스트 코드
테스트 코드를 통해 스프링 이벤트 리스너의 반응을 검증해 보자 📌 서론 스프링에서 Event-driven 아키텍처로 설계를 했을때 이벤트가 발행되면 리스너가 올바르게 반응하는지 테스트를 통해 검증하는 것은 매우 중요한 과정이라고 생각한다. 이번 포스트에서는 레시피를 생성하면서 스프링 이벤트(RecipeCreationEvent)를 발행했을 때 이 이벤트를 구독하고 있는 saveIngredientsIntoMongo 메서드가 제대로 호출되어 동작하는지 검증하는 테스트 코드를 작성하는 방법을 알아보자 1. 스프링 이벤트 리스너 코드 이해하기 아래의 코드는 설명을 이해하기 위해 알아야 할 SpringEventListener 클래스다. @Slf4j @Component @RequiredArgsConstructor p..
[Spring] 통합 테스트와 단위 테스트 비교하기
·
Spring/테스트 코드
통합테스트와 단위테스트를 작성하고 차이점을 비교해 보자 📌 서론 통합테스트 코드를 작성했는데 이런 생각이 들었다. "이걸 단위테스트 코드로 바꿔서 작성하면 기존 코드와 어떤 차이가 있을까? 그래서 당장 각 테스트 방법으로 코드를 작성하고 테스트를 해봤다. 지금부터 그 내용을 공유한다. 테스트를 하고자 하는 컨트롤러는 다음과 같다. 간단히 레시피를 생성하는 컨트롤러 메서드다. @RequestMapping("/recipe") @RequiredArgsConstructor @RestController public class RecipeController { private final CreateRecipeUseCase createRecipeUseCase; @PostMapping("/createRecipe") pu..