spring boot junit testSpring Boot JUnit 단위 테스트Spring Boot test스프링 JUnit 테스트스프링 Mockito

[Spring Boot] JUnit과 Mockito를 이용한 효율적인 테스트 전략

KUKJIN LEE
KUKJIN LEE
2024년 12월 9일
167

Spring Boot 애플리케이션을 개발할 때, 코드의 안정성과 품질을 유지하기 위해 단위 테스트는 필수적인 과정입니다. 특히, JUnit과 Mockito를 활용하면 테스트를 보다 효율적으로 작성할 수 있습니다.

 

단위 테스트란 무엇인가?

단위 테스트는 애플리케이션의 가장 작은 단위, 즉 클래스나 메서드 단위로 동작을 확인하는 테스트입니다. 이를 통해 코드의 예상 동작을 검증하고, 작은 부분에서 발생할 수 있는 오류를 빠르게 찾아낼 수 있습니다. Spring Boot에서는 JUnit과 Mockito를 이용해 테스트를 쉽게 작성하고 유지할 수 있습니다.

 

JUnit을 이용한 테스트 작성

JUnit은 Java의 대표적인 테스트 프레임워크로, 간단한 어노테이션과 메서드 구성을 통해 테스트를 작성할 수 있습니다. Spring Boot에서는 @Test 어노테이션을 사용하여 간단하게 테스트 케이스를 정의할 수 있습니다.

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class CalculatorTest {
    @Test
    public void testAddition() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
}

assertEquals()를 이용해 덧셈 메서드의 결과가 기대값과 일치하는지 검증합니다.

 

Mockito를 이용한 의존성 주입 모의(Mock)하기

Mockito는 의존성 주입을 모의 객체로 대체하여 테스트를 더 쉽게 작성할 수 있게 해주는 프레임워크입니다. 이를 통해, 데이터베이스 연결이나 외부 서비스 호출 없이도 테스트가 가능해집니다. 예를 들어, 서비스 레이어의 메서드를 테스트할 때 레포지토리 의존성을 모의 객체로 대체할 수 있습니다.

import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
import org.junit.jupiter.api.Test;

public class UserServiceTest {
    @Test
    public void testFindUser() {
        UserRepository userRepository = mock(UserRepository.class);
        UserService userService = new UserService(userRepository);
        User mockUser = new User("john", "doe");

        when(userRepository.findByUsername("john")).thenReturn(mockUser);

        User user = userService.findUser("john");
        assertEquals("john", user.getFirstName());
    }
}

Mockito를 활용하면 데이터베이스와 같은 복잡한 의존성을 제거하고 서비스의 비즈니스 로직을 간편하게 테스트할 수 있습니다.

 

단위 테스트 작성 시 고려사항

  • 테스트 독립성: 각각의 테스트는 독립적으로 실행되어야 하며, 다른 테스트의 결과에 영향을 받지 않아야 합니다.

  • 단순성 유지: 단위 테스트는 간단하고 명확해야 하며, 가능한 한 적은 수의 조건을 테스트해야 합니다.

  • 빠른 실행: 단위 테스트는 빨리 실행되어야 하며, 이를 통해 개발자는 자주 테스트를 실행하며 코드를 수정할 수 있습니다.

 

프로젝트 폴더 구조에서 테스트 코드 위치

Spring Boot 프로젝트에서 테스트 코드는 일반적으로 src/test/java 디렉토리에 위치합니다. 이 디렉토리 구조는 src/main/java에 있는 실제 소스 코드와 동일한 패키지 구조를 따르는 것이 좋습니다. 예를 들어, com.example.service.UserService 클래스에 대한 테스트 코드는 src/test/java/com/example/service/UserServiceTest에 위치시킵니다. 이를 통해 테스트 대상 클래스와 테스트 클래스 간의 관계를 명확히 하고 유지보수를 용이하게 할 수 있습니다.

 

JUnit과 Mockito를 사용한 단위 테스트는 코드 품질을 높이고 유지보수성을 향상시키는 중요한 도구입니다. Spring Boot 애플리케이션을 개발할 때 이러한 테스트를 잘 활용하면 예상치 못한 오류를 미연에 방지하고, 안정적인 코드를 유지하는 데 큰 도움이 됩니다.

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12