단위 테스트의 모킹과 스터빙

Java 테스트 소개

Maria Milusheva

Senior Software Engineer

동기: 의존성

이전 레슨의 의존성 흐름을 떠올려 보세요: 환율 앱은 은행 서버에 의존합니다: 은행 데모의 의존성 흐름을 보여주는 Mermaid 그래프

환율은 본질적으로 예측 불가하므로 계산을 검증하기 어렵습니다.

Java 테스트 소개

테스트에서의 의존성 관리

모킹: 테스트에서 사용하기 어려운 실제 객체를 대신할 모의 객체/동작을 만들어 외부 의존성 없이 테스트할 수 있게 합니다.


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

모킹 예시

Java 테스트 소개

모킹

  • Mock = 테스트 범위에서만 실제 객체처럼 행동하는 대역

이전 레슨 예시:

public double convertEuroTo(String currency, double amount) {
    double rate = this.bank.getRateEuroTo(currency);
    return amount * rate;
}

➡ 테스트용으로 EuropeanCentralBankServer를 예측 가능하게 만듭니다

Java 테스트 소개

모킹: 환율 변환

모크로 테스트하는 방법:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

// 모크가 동작하도록 설정 필요 when(bank.getRateEuroTo("USD")).thenReturn(1.1);
// 모크 객체의 getRateEuroTo 호출, 사전 설정 값을 받음 double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // 이제 정확한 반환값을 단언 가능 }
Java 테스트 소개

흔한 실수

모크 설정을 잊지 마십시오:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

    // 모크 미설정 - 모크 은행 객체는 getRateEuroTo에 응답 방법을 모름
    double result = exchangeApp.convertEuroTo("USD", 1000);

    assertEquals(1100, result); // 모크 설정 없음으로 실패
}
Java 테스트 소개

스터빙

테스트 실패:

org.opentest4j.AssertionFailedError: 
Expected :1100.0
Actual   :0.0

모크를 동작하도록 설정하는 것을 스터빙이라 합니다.

스터빙: 테스트 중 호출에 대해 최소한의 사전 정의된 응답을 제공하고, 테스트에 설정되지 않은 호출에는 보통 응답하지 않습니다.

Java 테스트 소개

Mockito의 예외 처리

Mockito는 오류 시나리오도 시뮬레이션할 수 있습니다:

EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// thenReturn() 대신 thenThrow() 사용
when(bank.getRateEuroTo("USD"))
        .thenThrow(new RuntimeException("Bank server unavailable."));

exchangeApp.convertEuroTo("USD", 1000); // getRateEuroTo가 예외를 던짐
Java 테스트 소개

실습해 봅시다!

Java 테스트 소개

Preparing Video For Download...