Java 테스트 소개
Maria Milusheva
Senior Software Engineer
이전 레슨의 의존성 흐름을 떠올려 보세요: 환율 앱은 은행 서버에 의존합니다:

환율은 본질적으로 예측 불가하므로 계산을 검증하기 어렵습니다.
모킹: 테스트에서 사용하기 어려운 실제 객체를 대신할 모의 객체/동작을 만들어 외부 의존성 없이 테스트할 수 있게 합니다.
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

이전 레슨 예시:
public double convertEuroTo(String currency, double amount) {
double rate = this.bank.getRateEuroTo(currency);
return amount * rate;
}
➡ 테스트용으로 EuropeanCentralBankServer를 예측 가능하게 만듭니다
모크로 테스트하는 방법:
@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); // 이제 정확한 반환값을 단언 가능 }
모크 설정을 잊지 마십시오:
@Test
void convert_returnsExpectedValue() {
EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// 모크 미설정 - 모크 은행 객체는 getRateEuroTo에 응답 방법을 모름
double result = exchangeApp.convertEuroTo("USD", 1000);
assertEquals(1100, result); // 모크 설정 없음으로 실패
}
테스트 실패:
org.opentest4j.AssertionFailedError:
Expected :1100.0
Actual :0.0
모크를 동작하도록 설정하는 것을 스터빙이라 합니다.
스터빙: 테스트 중 호출에 대해 최소한의 사전 정의된 응답을 제공하고, 테스트에 설정되지 않은 호출에는 보통 응답하지 않습니다.
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 테스트 소개