1. 기본 용어
<aside>
1️⃣ “모킹(Mocking)"이란
</aside>
- “모킹(Mocking)"이란 소프트웨어 개발 분야에서 주로 사용하는 용어로, 테스트를 위해 실제 객체 대신 사용하는 가짜 객체를 만드는 것을 말한다. 이런 가짜 객체를 '
mock
객체'라고 부르며, 이를 사용하여 코드의 동작을 테스트하거나, 예상치 못한 동작을 시뮬레이션하거나, 아직 구현되지 않은 코드의 동작을 가상으로 구현하는 등의 작업을 수행한다.
- 예를 들어, 외부 API를 호출하는 서비스를 테스트해야 하는 상황을 생각해 보자.
이 서비스는 외부 API에 의존성을 가지고 있으며, 실제로 외부 API를 호출하면 네트워크 지연, API의 가용성 문제 등 다양한 변수에 의해 테스트 결과가 달라질 수 있다. 이럴 때 mock 객체를 사용하면, 실제 API 대신 가짜 API를 사용하여 코드의 동작을 테스트할 수 있다. 이 가짜 API는 항상 같은 값을 반환하므로 테스트 결과는 일관성을 유지하게 된다.
- 모킹은 단위 테스트에서 특히 중요한 역할을 한다. 단위 테스트에서는 보통 테스트하려는 코드와 그 코드의 의존성을 가지는 다른 코드를 분리하여 테스트를 진행하는데, 이때 모킹이 활용된다. 모킹을 통해 의존성을 가지는 코드의 동작을 가상으로 구현하면, 테스트하려는 코드가 의존성을 가지는 코드에 영향을 받지 않고 독립적으로 테스트할 수 있게 된다.
<aside>
2️⃣ 사용되는 어노테이션
</aside>
@SpringBootTest
- 이 어노테이션은 스프링 부트 테스트를 위한 가장 기본적인 어노테이션이다. 이 어노테이션을 사용하면 스프링 부트의 모든 기능을 로드하여 통합 테스트를 수행할 수 있다.
@Test
- JUnit에서 제공하는 어노테이션으로, 메소드가 테스트를 수행하는 메소드임을 선언한다.
@Before
, @After
, @BeforeEach
, @AfterEach
- 이들 어노테이션은 각각 테스트 메소드 이전과 이후에 실행될 메소드를 정의하는 데 사용된다.
@Mock
- Mockito에서 제공하는 어노테이션으로, 클래스 또는 인터페이스의 mock 객체를 생성한다.
@InjectMocks
- Mockito에서 제공하는 어노테이션으로, 모든
@Mock
또는 @Spy
어노테이션이 붙은 객체를 대상 객체에 주입한다.
@WebMvcTest
- 웹 계층만 로드하는 데 사용하는 어노테이션이다.
@Controller
, @ControllerAdvice
등을 포함하고, @Component
, @Service
, @Repository
등은 포함하지 않는다.
@DataJpaTest
- JPA 관련 설정만 로드하는 데 사용하는 어노테이션이다. Repository 계층만 테스트하는 데 유용하다.
@MockBean
- Spring Boot에서 제공하는 어노테이션으로, ApplicationContext에 mock 객체를 등록하고 관리하는 데 사용된다.
@Autowired
- 의존성 주입을 위한 스프링 어노테이션이다. 테스트 코드에서는 주로 테스트 대상 객체 또는 mock 객체를 주입하는 데 사용된다.
@TestConfiguration
- 테스트를 위한 별도의 설정을 정의하는 데 사용되는 어노테이션이다. 이 어노테이션을 사용하면 테스트에만 적용되는 추가적인 Bean 등록 등의 설정을 할 수 있다.
2. MockMvc란
**MockMvc
**는 Spring Test Library에서 제공하는 한 클래스로서, 웹 서버를 따로 구동시키지 않아도 Spring MVC의 동작을 모방(mock)하도록 도와준다. 이를 통해 Controller가 정상적으로 동작하는지 테스트할 수 있다.
- MockMvc 설정하기
MockMvc 인스턴스는 **
@WebMvcTest
**나 **MockMvcBuilders
**를 통해 생성할 수 있다.