본문 바로가기
프레임워크/스프링

Mockito와 BDDMockito

by so5663 2024. 3. 20.

테스트 코드 작성중에 의문이 생겼습니다.

 

mock 객체를 when().thenReturn()을 통해 사용하고,

어떤 부분에서는 given().willReturn()을 통해 사용하는 것이었다.

import 문을 확인해보니 전자는 org.mockito.Mockito를 import하고

후자는 org.mockito.BDDMockito를 import한다.

 

Mockito?

spring은 객체간의 의존성을 관리해주는데 이 의존성은 테스트 코드 단위테스트를 작성할때 문제가 생긴다.

의존성을 가지는 다른 객체에 의해 테스트 결과가 영향을 받는다.

 

그래서 내가 원하는 동작만 하도록 하는것이 Mock 객체다.

이를 편하게 사용하도록 지원하는것이 Mockito 이다.

 

예제 소스

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
public class MyServiceTest {

    // @Mock 애노테이션을 사용하여 Mock 객체 생성
    @Mock
    private MyDependency myDependency;

    @Test
    void testDoSomething() {
        // Mock 객체의 행위 설정
        when(myDependency.someMethod()).thenReturn("Mocked result");

        // 테스트 대상 객체 생성
        MyService myService = new MyService(myDependency);

        // 테스트 실행
        String result = myService.doSomething();

        // 결과 검증
        assertEquals("Mocked result", result);
    }
}

 

MyService 클래스가 MyDependency라는 외부 의존성을 가지고 있다고 가정합니다.

이 의존성을 Mock 객체로 대체하여 테스트를 진행합니다.

 

@Mock 애노테이션을 사용하여 myDependency라는 Mock 객체를 생성합니다.

그리고 when().thenReturn() 메서드를 사용하여 Mock 객체의 someMethod() 메서드가 호출되었을 때

반환할 값을 설정합니다.

 

BDD(Behavior-Driven Development)?

BDD는 Behavior-Driven Development의 약자로 행위 주도 개발을 말한다.

테스트 대상의 상태의 변화를 테스트하는 것이고, 시나리오를 기반으로 테스트하는 패턴을 권장한다.

여기서 권장하는 기본 패턴은 Given, When, Then 구조를 가진다.

 

BDDMockito!

BDDMockito의 코드를 살펴보면 Mockito을 상속한 클래스임을 알 수 있다.

그리고 동작이나 사용하는 방법 또한 Mockito와 거의 차이가 없다.

 

예제 소스

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;

@ExtendWith(MockitoExtension.class)
public class MyServiceTest {

    // @Mock 애노테이션을 사용하여 Mock 객체 생성
    @Mock
    private MyDependency myDependency;

    // @InjectMocks 애노테이션을 사용하여 테스트 대상 객체 주입
    @InjectMocks
    private MyService myService;

    @Test
    void testDoSomething() {
        // given: Mock 객체의 행위 설정
        given(myDependency.someMethod()).willReturn("Mocked result");

        // when: 테스트 대상 메서드 호출
        String result = myService.doSomething();

        // then: 결과 검증
        assertThat(result).isEqualTo("Mocked result");
    }
}

 

BDDMockito에서는 given().willReturn() 메서드를 사용하여 Mock 객체가 특정 메서드를 호출했을 때

반환할 값을 설정합니다.

'프레임워크 > 스프링' 카테고리의 다른 글

Spring Scheduler와 Spring Quartz 차이  (0) 2024.04.13
[Spring] MockMvc  (0) 2024.03.18
[Spring] 프로메테우스, 그라파나 아키텍처 사용  (0) 2024.02.16
[Spring] actuator  (0) 2024.02.15
[SpringBoot] 라이브러리 관리  (0) 2023.03.11