[java] Mockito를 사용하여 실제 데이터베이스를 사용하지 않고 DB 작업을 테스트하는 방법은?

Mockito는 자바에서 단위 테스트를 작성할 때 가짜 객체를 생성하고 행동을 제어하는 데 사용되는 유명한 mocking 프레임워크입니다. 이를 사용하여 실제 데이터베이스에 액세스하지 않고 데이터베이스 작업을 테스트할 수 있습니다.

아래는 Mockito를 사용하여 실제 데이터베이스를 사용하지 않고 DB 작업을 테스트하는 방법을 설명하는 단계입니다.

1. 의존성 추가

먼저 Mockito를 프로젝트에 추가해야합니다. Maven을 사용하는 경우 pom.xml 파일에 다음 의존성을 추가합니다.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.12.4</version>
    <scope>test</scope>
</dependency>

Gradle을 사용하는 경우 build.gradle 파일에 다음 의존성을 추가합니다.

testImplementation 'org.mockito:mockito-core:3.12.4'

2. Mock 객체 생성

DB 작업과 관련된 DAO(Data Access Object) 또는 Repository 클래스를 대상으로 Mock 객체를 생성합니다.

import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class MyTest {

    @Mock
    private MyDAO myDAO;

    // ...

    @Before
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }
    
    // ...
}

@Mock 어노테이션을 사용하여 Mock 객체를 생성하고, MockitoAnnotations.openMocks(this)를 통해 Mock 객체들을 초기화합니다.

3. Mock 객체에 대한 행동 정의

생성한 Mock 객체에 대해 어떻게 동작할지 정의합니다. 예를 들어, 특정 메서드를 호출하면 어떤 값을 반환하도록 하거나, 파라미터에 맞는 값을 받으면 특정 동작을 수행하도록 설정할 수 있습니다.

import static org.mockito.Mockito.when;

@Test
public void testDBOperation() {
    // Mock 객체의 동작 정의
    when(myDAO.getById(1)).thenReturn(new MyEntity(1, "Example"));

    // Mock 객체를 사용하는 DB 작업 수행
    MyEntity result = myDAO.getById(1);

    // 결과 검증
    assertEquals("Example", result.getName());
}

when() 메서드를 사용하여 Mock 객체의 메서드 호출에 대한 동작을 정의합니다. thenReturn()을 이용하여 메서드 호출에 대한 결과를 설정합니다.

4. 테스트 실행

실제로 작성한 테스트 메서드를 실행하여 DB 작업이 의도한 대로 동작하는지 확인합니다.

위의 예시에서는 myDAO.getById(1) 호출 시 Mock 객체가 정의한 값인 new MyEntity(1, "Example")을 반환합니다. 이 결과를 검증하여 테스트를 통과하게 됩니다.


위의 과정을 따라하면 Mockito를 사용하여 실제 데이터베이스를 사용하지 않고 DB 작업을 테스트하는데 도움이 될 것입니다. 이를 통해 테스트 환경을 구축하고 더 쉽게 개발할 수 있습니다.

참고 자료: