[java] Mockito를 사용하여 서비스 계층과 데이터 액세스 계층 간의 상호작용을 테스트하는 방법은?

모키토(Mockito)는 자바에서 테스트 대상 객체의 모의(mock)를 생성하고 기대 동작을 정의하는 데 사용되는 유명한 모의 객체 프레임워크입니다. 이를 활용하여 서비스 계층과 데이터 액세스 계층 간의 상호작용을 테스트할 수 있습니다. 이번 글에서는 Mockito를 사용하여 서비스 계층과 데이터 액세스 계층을 테스트하는 예제 코드를 소개하겠습니다.

1. Mockito를 설정하기

첫 번째로, Mockito를 프로젝트에 추가해야 합니다. Gradle을 사용하는 경우 build.gradle 파일에 다음 의존성을 추가합니다:

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

Maven을 사용하는 경우 pom.xml 파일에 다음 의존성을 추가합니다:

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

의존성을 추가한 후, Mockito를 사용할 준비가 완료됩니다.

2. 테스트 대상 객체 모의(mock) 생성하기

서비스 계층과 데이터 액세스 계층 간의 상호작용을 테스트하기 위해, 먼저 테스트 대상 객체에 대한 모의(mock) 객체를 생성해야 합니다. 서비스 계층에서 데이터 액세스 계층과 상호작용하는 클래스에 대한 모의(mock) 객체를 생성합니다.

예를 들어, 다음과 같은 서비스 클래스가 있다고 가정해보겠습니다:

public class MyService {
    private MyRepository myRepository;

    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public void doSomething() {
        // 데이터 액세스 계층과의 상호작용 코드
        myRepository.saveData();
    }
}

위의 서비스 클래스에서는 MyRepository 인터페이스를 이용하여 데이터 액세스 계층과 상호작용합니다.

테스트에서는 MyRepository 인터페이스를 구현한 모의(mock) 객체를 생성하여 사용합니다. Mockito를 활용하면 다음과 같이 모의(mock) 객체를 생성할 수 있습니다:

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

위의 코드를 통해 MyRepository 인터페이스에 대한 모의(mock) 객체가 생성되었습니다.

3. 모의(mock) 객체의 기대 동작 정의하기

테스트에서 모의(mock) 객체의 기대 동작을 정의해야 합니다. 즉, 특정 메소드가 호출될 때 어떤 동작이 수행되어야 하는지를 설정해야 합니다.

예를 들어, saveData() 메소드가 호출될 때 특정 동작을 하도록 정의하고 싶다면, 다음과 같이 기대 동작을 설정합니다:

Mockito.when(mockRepository.saveData()).thenReturn(true);

위의 코드는 saveData() 메소드가 호출될 때 true 값을 반환하도록 정의한 것입니다.

4. 테스트 코드 작성하기

모의(mock) 객체를 생성하고 기대 동작을 정의한 후, 실제로 테스트를 수행하는 코드를 작성해야 합니다.

예를 들어, doSomething() 메소드를 호출하였을 때 데이터 액세스 계층의 saveData() 메소드가 호출되는지를 검증하고 싶다면, 다음과 같이 테스트 코드를 작성할 수 있습니다:

@Test
public void testDoSomething() {
    // Given
    MyRepository mockRepository = Mockito.mock(MyRepository.class);
    Mockito.when(mockRepository.saveData()).thenReturn(true);
    MyService myService = new MyService(mockRepository);

    // When
    myService.doSomething();

    // Then
    Mockito.verify(mockRepository).saveData();
}

위의 테스트 코드에서는 doSomething() 메소드를 호출하고, saveData() 메소드가 실제로 호출되는지를 Mockito.verify() 메소드를 사용하여 검증합니다.

결론

이러한 방법을 활용하여 Mockito를 사용하여 서비스 계층과 데이터 액세스 계층 간의 상호작용을 테스트할 수 있습니다. Mockito를 사용하면 실제 데이터베이스나 네트워크 연결 없이도 효과적으로 테스트할 수 있습니다. Mockito의 다양한 기능을 활용하여 테스트 코드를 작성하면 개발 생산성과 코드 품질을 향상시킬 수 있습니다.

References