Testing Spring Boot Applications with JUnit and Mockito

Testing Spring Boot Applications with JUnit and Mockito

Spring Boot Testing

Spring Boot 애플리케이션 테스트란?

Spring Boot는 웹 애플리케이션 개발에 있어서 높은 생산성과 편의성을 제공하는 프레임워크이다. 그러나 프레임워크를 사용하더라도 테스트가 필요한 것은 마찬가지다. Spring Boot 애플리케이션 테스트는 어플리케이션의 동작을 검증하고 품질을 보장하기 위한 필수적인 과정이다.

Spring Boot에서 테스트를 작성할 수 있는 여러 가지 방법이 있지만, 이번에는 JUnit과 Mockito를 사용하는 방법에 대해 살펴보겠다.

JUnit과 Mockito를 활용한 Spring Boot 테스트 방법

JUnit은 Java에서 가장 많이 사용되는 테스트 프레임워크 중 하나이다. Mockito는 JUnit과 함께 사용되면서 객체를 쉽게 모킹(mocking)할 수 있는 라이브러리이다.

Spring Boot 애플리케이션에서 JUnit과 Mockito를 사용하여 테스트를 작성하려면 다음과 같은 단계를 거쳐야 한다.

  1. @RunWith(SpringRunner.class) 애너테이션을 사용하여 Spring Boot 애플리케이션 컨텍스트를 로드한다.
  2. @MockBean 애너테이션을 사용하여 모킹할 객체를 생성한다.
  3. @Autowired 애너테이션을 사용하여 실제 객체를 주입한다.
  4. @Test 애너테이션을 사용하여 테스트 케이스를 작성한다.

예를 들어, 다음과 같이 UserService 클래스를 테스트하는 코드를 작성할 수 있다.

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

    @MockBean
    private UserRepository userRepository;

    @Autowired
    private UserService userService;

    @Test
    public void testGetUserById() {
        User user = new User("John", "Doe");
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));
        assertThat(userService.getUserById(1L)).isEqualTo(user);
    }
}

위 코드에서 @RunWith(SpringRunner.class) 애너테이션은 Spring 컨텍스트를 로드하고, @MockBean 애너테이션은 UserRepository 클래스를 모킹한다. @Autowired 애너테이션은 UserService 클래스를 주입한다. @Test 애너테이션은 testGetUserById() 메소드를 테스트 케이스로 지정한다.

Spring Boot 애플리케이션 테스트 시나리오: 예제와 함께 살펴보기

Spring Boot 애플리케이션 테스트를 위해 간단한 예제를 작성해보자. 예제에서는 UserController 클래스를 테스트하며, GET /users/{id} API를 호출할 때 해당하는 User 객체를 반환하는지 검증한다.

UserController 클래스

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity getUserById(@PathVariable Long id) {
        User user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }
}

UserController 클래스는 UserService 클래스를 주입받아 GET /users/{id} API를 제공한다. API는 @GetMapping 애너테이션을 사용하여 매핑되며, @PathVariable 애너테이션을 사용하여 id 값을 전달받는다. UserService 클래스는 UserRepository를 주입받아 findById() 메소드를 호출하여 User 객체를 반환한다.

UserService 클래스

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User getUserById(Long id) {
        Optional user = userRepository.findById(id);
        if (user.isPresent()) {
            return user.get();
        } else {
            throw new UserNotFoundException("User not found with id : " + id);
        }
    }
}

UserService 클래스는 UserRepository를 주입받아 findById() 메소드를 호출하여 User 객체를 반환한다. 만약 User 객체가 존재하지 않으면 UserNotFoundException 예외를 던진다.

UserRepository 클래스

@Repository
public interface UserRepository extends JpaRepository {

}

UserRepository 클래스는 JpaRepository 인터페이스를 상속받아 User 객체를 데이터베이스에 저장하고 조회하는 메소드를 제공한다.

UserControllerTest 클래스

@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private UserService userService;

    @Test
    public void testGetUserById() throws Exception {
        User user = new User("John", "Doe");
        when(userService.getUserById(1L)).thenReturn(user);
        mvc.perform(get("/users/1"))
                .andExpect(status().isOk())
                .andExpect(content().json("{"firstName":"John","lastName":"Doe"}"));
    }
}

UserControllerTest 클래스는 UserController 클래스를 테스트하기 위해 @WebMvcTest 애너테이션을 사용한다. @MockBean 애너테이션을 사용하여 UserService 클래스를 모킹한다. @Autowired 애너테이션을 사용하여 MockMvc 객체를 주입한다. testGetUserById() 메소드는 GET /users/1 API를 호출하고, 반환된 User 객체를 검증한다.

결론

Spring Boot 애플리케이션 테스트는 애플리케이션의 동작을 검증하고 품질을 보장하는 필수적인 과정이다. JUnit과 Mockito를 사용하여 Spring Boot 애플리케이션을 테스트할 수 있다. 이번 글에서는 JUnit과 Mockito를 사용하여 간단한 예제를 작성하고, Spring Boot 애플리케이션을 테스트하는 방법을 살펴보았다. 테스트 코드를 작성하여 애플리케이션의 품질을 높이자.