[java] Mockito를 사용한 비동기 코드 테스트

자바에서 비동기 코드를 테스트하는 것은 종종 도전적인 일일 수 있습니다. 특히 외부 API 호출 또는 다른 비동기적 작업을 포함하는 코드의 경우, 전통적인 단위 테스트 방법론으로는 테스트하기 어렵습니다. 이때 Mockito 프레임워크를 사용하면 비동기 코드를 테스트하는 것이 좀 더 쉬워집니다.

Mockito 소개

Mockito는 자바에서 단위 테스트를 위해 쉽고 유연한 목(Mock) 객체를 만들고 조작할 수 있는 오픈 소스 모킹 프레임워크입니다. Mockito를 사용하면 외부 의존성을 제어할 수 있어서 코드를 더 쉽게 테스트할 수 있습니다.

비동기 코드를 테스트하는 방법

비동기 코드를 테스트하려면 CompletableFuture나 콜백 기반의 코드를 가지고 있는 경우가 많습니다. Mockito를 사용하여 이러한 비동기 코드를 테스트할 때, 다음과 같은 방법을 사용할 수 있습니다.

1. CompletableFuture를 이용한 테스트

다음은 CompletableFuture를 이용한 간단한 비동기 코드의 예제입니다.

import java.util.concurrent.CompletableFuture;

public class AsyncService {
    public CompletableFuture<String> fetchDataAsync() {
        return CompletableFuture.supplyAsync(() -> "Data");
    }
}

위 코드를 테스트 하기 위해서 Mockito의 thenReturn 메서드를 사용하여 supplyAsync 메서드의 반환값을 목 객체로 대체할 수 있습니다.

import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;

import java.util.concurrent.CompletableFuture;

public class AsyncServiceTest {
    @Test
    public void testFetchDataAsync() {
        AsyncService asyncService = mock(AsyncService.class);
        when(asyncService.fetchDataAsync()).thenReturn(CompletableFuture.completedFuture("Mocked Data"));

        // 테스트 코드 작성
    }
}

2. 콜백 기반 비동기 코드의 테스트

콜백 기반의 비동기 코드를 테스트하는 경우, Mockito의 Answer 인터페이스를 사용하여 콜백 동작을 목 객체로 대체할 수 있습니다.

import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

public class CallbackHandler implements Answer<Void> {
    @Override
    public Void answer(InvocationOnMock invocation) {
        // 콜백 동작 목 객체의 동작 정의
        return null;
    }
}

위와 같이 Answer 인터페이스를 구현하는 클래스를 만들어 콜백 동작을 정의한 후에, Mockito를 사용하여 목 객체를 만들고 콜백 동작을 대체할 수 있습니다.

마무리

Mockito를 사용하여 비동기 코드를 테스트하는 방법을 살펴보았습니다. 이를 통해 외부 의존성이나 복잡한 비동기 코드를 포함한 메서드를 테스트하는 것이 쉬워진다는 장점을 얻을 수 있습니다. Mockito를 잘 활용하면 자바 애플리케이션의 테스트 코드 작성이 더욱 쉬워질 것입니다.

더 많은 Mockito의 활용법은 Mockito 공식 문서에서 확인할 수 있습니다.