자바 공부/스프링공부

스프링 Junit5 와 Mockito를 이용한 단위 테스트

ari0930 2025. 2. 18. 23:34

JUnit 5(Jupiter)와 Mockito를 이용한 단위 테스트

1. 의존성 설정

JUnit 5와 Mockito를 사용하여 단위 테스트를 진행하려면 먼저 프로젝트에 필요한 의존성을 추가해야 합니다. Spring Boot 환경에서 테스트를 진행할 경우 아래와 같이 build.gradle 또는 pom.xml에 추가하면 됩니다.

// build.gradle

testImplementation("org.mockito:mockito-core")
testImplementation("org.mockito:mockito-junit-jupiter")
testImplementation 'org.springframework.boot:spring-boot-starter-test'

2. User 엔티티

아래는 User 엔티티의 예제 코드입니다. @Entity와 @Table 어노테이션을 사용하여 데이터베이스 테이블과 매핑되도록 구성했습니다.

@Entity
@Table(name = "users")
@NoArgsConstructor
@Data
@ToString
public class User implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userNumber;
    private String name;
    private String userId;
    private String password;
    private String role;

    @Builder
    public User(String name, String userId, String password, String role) {
        this.name = name;
        this.userId = userId;
        this.password = password;
        this.role = role;
    }
}

3. UserService 클래스

User 정보를 관리하는 UserService 클래스입니다. userRepository.findByUserId(id)를 이용해 특정 userId에 해당하는 사용자를 조회하는 기능을 제공합니다.

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    public User getUserById(String id) {
        return userRepository.findByUserId(id);
    }
}

4. UserRepository 인터페이스

Spring Data JPA를 이용하여 User 엔티티를 관리하는 UserRepository를 정의합니다.

public interface UserRepository extends JpaRepository<User, Long> {
    // userId로 검색
    User findByUserId(String userId);
}

5. UserService 단위 테스트

이제 JUnit 5와 Mockito를 활용하여 UserService의 getUserById 메서드를 테스트해 보겠습니다.

테스트 코드

import org.example.todo.entity.User;
import org.example.todo.repository.UserRepository;
import org.example.todo.service.UserService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    void testGetUserById() {
        // Given
        User user = new User("한국", "korea", "12345", "일반유저");
        user.setUserNumber(1L);

        when(userRepository.findByUserId("korea")).thenReturn(user);

        // When
        User findUser = userService.getUserById("korea");
        
        // Then
        assertEquals("한국", findUser.getName());
    }
}

어노테이션 설명

  • @ExtendWith(MockitoExtension.class): Mockito를 활성화하여 @Mock 및 @InjectMocks 어노테이션을 사용할 수 있도록 해줍니다.
  • @Mock: 실제 데이터베이스에 접근하지 않고 가짜 객체(Mock)를 생성하여 UserRepository를 대신합니다.
  • @InjectMocks: UserService 객체를 생성하고 @Mock으로 생성된 UserRepository 객체를 자동으로 주입합니다.

6. Given/When/Then 패턴

  • Given : 어떠한 데이터가 주어질 때.
  • When : 어떠한 기능을 실행하면.
  • Then : 어떠한 결과를 기대한다.

Give

테스트에 사용할 가짜 user 객체를 생성

User user = new User("한국", "korea", "12345", "일반유저");

when(userRepository.findByUserId("korea")).thenReturn(user);

⇒ userRepository.findByUserId가 호출되었을시 thenReturn 을 통해user 객체를 반환하도록 설정

when

실제로 테스트해야할 서비스의 메소드를 실행시켜 원하는값을 반환하도록 한다.

User findUser = userService.getUserById("korea");

이렇게 하면 userService의 getUserById 에서 userRepository.findByUserId호출되고

이는 우리가 만들어둔 user객체를 반환 하도록 한다.

Then

when 에서 반환된 값이 예상하는 결과 하고 받는지 검증하는 부분이다

assertEquals을 사용하여 원하는 결과값하고 비교할수 있습니다.

assertEquals("한국", findUser.getName());

반응형