본문 바로가기
Web Technologies 🖥️/java

테스트 코드(JUnit)에서 모의 객체가 필요할 땐? "Mockito"

by dudefromkorea 2023. 12. 26.

Mockito 란?

자바 기반의 모킹 프레임워크이며,

실제 의존성을 모의 객체로 대체하여

유연하고 독립적인 테스트를 가능하도록 한다

 

모킹(Mocking)이란?

테스트 코드 외부에 있는

의존성들을 대체하기 위해 사용되는

가짜 객체(Mock Objects)를 생성하는 기술

 

(테스트 코드에 대한 설명 보러 가기)

 

Mockito 의 주요 기능

#1 인자 매처

메소드를 특정 타입의 인자나 조건을

만족할 때만 지정한 값을 반환하도록 설정하여

다양한 입력 값에 대한 메소드의 동작을 검증할 수 있다

 

#2 행동의 검증

메소드가 정상적으로 호출되었는지,

어떤 매개변수로 호출되었는지,

호출 횟수는 몇 번인지 검증하여

DB 에 저장하는 로직을 검증할 수 있다

 

#3 부분적인 모의

복잡한 서비스 객체에서 특정 메소드만 모의하여

나머지 메소드는 실제 로직을 유지하면서 검증할 수 있다

 

#4 메소드 호출의 모의

특정 객체의 메소드 호출을 모의하여

해당 메소드가 호출될 때 원하는 값을 반환하거나

특정 행동을 하도록 설정할 수 있다

(외부 API 를 호출하는 경우 응답을 모의하여 검증할 수 있다)

 

#5 예외 및 특정 동작의 모의

메소드 호출 시 예외를 임의로 발생시키거나

특정 동작을 수행하도록 설정하여,

예외 처리나 특정 상황에서의 응답을 검증할 수 있다

 

(JUnit 에 대한 설명 보러 가기)

 

1. Mockito 직접 사용

Mockito.mock() 메소드를

직접 호출하여 모의 객체를 생성할 수 있다

 

 2. JUnit 과 Mockito 어노테이션

해당 어노테이션을 통해 JUnit 과 Mockito 를 통합할 수 있다

(Mockito 가 JUnit 에만 국한되어 있는 것은 아니다!)

JUnit 4: @RunWith(MockitoJUnitRunner.class) + @Mock

JUnit 5: @ExtendWith(MockitoExtension.class) + @Mock

 

@Mock 은 모의 객체(Mock Object)를 생성하는 데 사용되고,

@RunWith(...) / @ExtendWith(...)

생성된 모의 객체들의 자동 초기화 및 관리를 담당한다

 

 단위 테스트에 적용 시

단위 테스트는 최대한 간결하고

명확해야 하기 때문에 Mockito 를 직접 사용하여

테스트의 의도를 명확하게 드러내고, 간결하게 사용할 수 있다

 

필요한 경우 어노테이션을 활용하여

테스트의 가독성을 높일 수 있다

@Test
public void testUnit() {
    MyDependency dependency = mock(MyDependency.class);
    when(dependency.someMethod()).thenReturn("Mocked");

    MyService service = new MyService(dependency);
    String result = service.useDependency();

    assertEquals("Mocked", result);
}

 

 

 통합 테스트에 적용 시

어노테이션을 사용할 경우(특히 Spring Boot)

스프링의 의존성 주입과 자동 구성 기능을 이용하여,

실제 환경과 유사하게 테스트를 진행할 수 있다

@Resource
private MyService service;

@MockBean
private MyDependency dependency;

@Test
public void testIntegration() {
    when(dependency.someMethod()).thenReturn("Mocked");
    String result = service.useDependency();

    assertEquals("Mocked", result);
}
728x90
반응형