본문 바로가기

Study Information Technology

Spring Boot와 Mockito 단위 테스트의 이상적인 조합

728x90
반응형

Spring Boot와 Mockito: 단위 테스트의 이상적인 조합

Overview

Spring Boot와 Mockito는 자바 애플리케이션의 단위 테스트를 쉽게 작성할 수 있도록 도와주는 강력한 도구입니다. Spring Boot는 애플리케이션 개발을 간소화하고, Mockito는 테스트에서 의존성을 모킹하는 기능을 제공합니다. 이 두 도구를 함께 사용하면 테스트를 작성하고 유지보수하는 과정이 훨씬 수월해집니다. 이번에는 Spring Boot 애플리케이션에서 Mockito를 사용하는 방법을 자세히 설명하겠습니다.

1. Spring Boot와 Mockito 소개

Spring Boot는 스프링 프레임워크를 기반으로 하여 애플리케이션의 설정과 배포를 간소화하는 데 중점을 둡니다. @SpringBootApplication 어노테이션으로 설정된 기본적인 구성을 제공하며, 자동 설정(auto-configuration) 기능을 통해 복잡한 설정 없이 애플리케이션을 빠르게 시작할 수 있습니다.

Mockito는 자바에서 모킹(mocking) 라이브러리로, 단위 테스트에서 의존성 객체를 대체(mock)하여 테스트의 독립성과 신뢰성을 높입니다. Mockito를 사용하면 실제 객체 대신 가짜 객체를 사용하여 메서드 호출을 검증하고, 메서드 호출의 결과를 제어할 수 있습니다.

2. Spring Boot와 Mockito 설정

2.1. 의존성 추가

먼저, Spring Boot와 Mockito를 사용하기 위해 필요한 의존성을 pom.xml 파일에 추가합니다. Maven을 사용하는 경우, 다음과 같은 의존성을 추가하면 됩니다:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>4.0.0</version>
  <scope>test</scope>
</dependency>

이 의존성들은 JUnit, Mockito, AssertJ 등을 포함하여 테스트를 위한 기본적인 환경을 제공합니다.

2.2. 테스트 클래스 설정

테스트 클래스를 설정할 때 @SpringBootTest 어노테이션을 사용하여 Spring Boot 애플리케이션 컨텍스트를 로드합니다. Mockito와의 통합을 위해 @MockBean 어노테이션을 사용할 수 있습니다.

다음은 간단한 테스트 클래스의 예시입니다:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTest {

@Autowired
private MyService myService;

@MockBean
private MyRepository myRepository;

@Test
public void testServiceMethod() {
// given
Mockito.when(myRepository.findSomething()).thenReturn("mocked value");

// when
String result = myService.serviceMethod();

// then
Assert.assertEquals("mocked value", result);
}
}
  • @RunWith(SpringRunner.class)은 JUnit과 Spring의 통합을 지원합니다.
  • @SpringBootTest는 전체 애플리케이션 컨텍스트를 로드하여 통합 테스트를 수행할 수 있게 합니다.
  • @MockBean은 애플리케이션 컨텍스트에 Mockito 모의 객체를 주입합니다.

3. Mockito의 주요 기능과 사용법

3.1. 모의 객체 생성

Mockito를 사용하여 모의 객체를 생성할 수 있습니다. 다음은 Mockito.mock() 메서드를 사용하는 예시입니다:

MyRepository myRepository = Mockito.mock(MyRepository.class);

이렇게 생성된 모의 객체는 실제 구현체가 아니라, Mockito에서 제공하는 가짜 객체입니다.

3.2. 메서드 호출에 대한 동작 정의

모의 객체의 메서드 호출에 대해 반환값을 정의할 수 있습니다. Mockito.when()을 사용하여 특정 메서드 호출 시 반환할 값을 설정합니다:

Mockito.when(myRepository.findSomething()).thenReturn("mocked value");
3.3. 메서드 호출 검증

테스트가 끝난 후, 모의 객체의 메서드가 예상대로 호출되었는지 검증할 수 있습니다. Mockito.verify() 메서드를 사용하여 호출 횟수 등을 검증할 수 있습니다:

Mockito.verify(myRepository, Mockito.times(1)).findSomething();

4. 에러 처리 및 해결 방법

테스트 중 자주 발생할 수 있는 에러와 그 해결 방법을 살펴보겠습니다.

4.1. NullPointerException

문제: Mockito 모의 객체가 제대로 설정되지 않았거나 @MockBean을 사용하지 않았을 때 발생할 수 있습니다.

해결 방법: @MockBean을 사용하는 경우, 애플리케이션 컨텍스트에서 모의 객체를 제대로 주입받았는지 확인합니다. 또한, @RunWith(SpringRunner.class)@SpringBootTest가 올바르게 설정되었는지 검토합니다.

@MockBean
private MyRepository myRepository;
4.2. StubbingException

문제: 모의 객체의 메서드에 대해 예상치 못한 동작이 정의되었거나 설정이 잘못되었을 때 발생할 수 있습니다.

해결 방법: Mockito.when() 호출 시, 메서드 시그니처와 반환 타입이 정확한지 확인합니다. 필요 시 thenThrow()를 사용하여 예외를 던지는 동작을 정의할 수도 있습니다.

Mockito.when(myRepository.findSomething()).thenReturn("mocked value");
4.3. AssertionError

문제: 실제 결과와 예상 결과가 다를 때 발생할 수 있습니다.

해결 방법: Assert.assertEquals()를 사용할 때, 실제와 예상 결과가 정확히 일치하는지 확인합니다. 테스트 로직이 올바른지 점검합니다.

Assert.assertEquals("mocked value", result);

참고문서

이 자료들은 Spring Boot와 Mockito를 사용하여 단위 테스트를 작성할 때 유용한 정보를 제공합니다.

728x90
반응형