[java] Mockito를 사용하여 실행 중인 스레드를 모킹하는 방법은?

Mockito를 사용하면 테스트 중에 스레드 동작을 모킹하고 검증할 수 있습니다. 스레드 동작을 모킹하는 가장 일반적인 시나리오 중 하나는 비동기 백그라운드 작업을 테스트하는 것입니다. Mockito를 사용하여 실행 중인 스레드를 모킹하는 방법에 대해 알아보겠습니다.

1. ExecutorService 사용하기

ExecutorService를 사용하여 스레드를 실행하고 모킹할 수 있습니다. Mockito의 doAnswer 메서드를 사용하여 스레드가 실행되는 동안 원하는 동작을 수행하도록 지정할 수 있습니다.

import static org.mockito.Mockito.*;

ExecutorService executorService = mock(ExecutorService.class);

// 스레드 실행 시 원하는 동작 정의
doAnswer(invocation -> {
    Runnable runnable = invocation.getArgument(0);
    // 원하는 동작 수행
    runnable.run();
    return null;
}).when(executorService).execute(any(Runnable.class));

// 스레드 실행
executorService.execute(() -> {
    // 모킹된 스레드 동작
});

// 스레드 동작 검증
verify(executorService).execute(any(Runnable.class));

2. Async 라이브러리 사용하기

Async 라이브러리를 사용하여 비동기 작업을 모킹할 수도 있습니다. Mockito의 when 메서드를 사용하여 스레드가 실행되는 동안 원하는 동작을 정의할 수 있습니다.

import static org.mockito.Mockito.*;

Async async = mock(Async.class);

// 비동기 작업 실행 시 원하는 동작 정의
when(async.callAsync(any(Callable.class))).thenAnswer(invocation -> {
    Callable<?> callable = invocation.getArgument(0);
    // 원하는 동작 수행
    Object result = null;
    try {
        result = callable.call();
    } catch (Exception e) {
        // 예외 처리
    }
    return CompletableFuture.completedFuture(result);
});

// 비동기 작업 실행
async.callAsync(() -> {
    // 모킹된 스레드 동작
    return null;
});

// 스레드 동작 검증
verify(async).callAsync(any(Callable.class));

위의 예시 코드에서 Async는 실제 비동기 작업을 수행하는 인터페이스를 나타냅니다. 사용하는 라이브러리에 따라 다를 수 있으니 해당 라이브러리의 문서를 참고하시기 바랍니다.

이러한 방법을 사용하여 Mockito를 통해 실행 중인 스레드를 모킹할 수 있습니다. 이를 통해 비동기 작업을 포함한 다양한 스레드 동작을 테스트할 수 있습니다.

참고 자료