본문 바로가기
코딩 공부/web & Java

[Java] Mockito

by 현장 2023. 12. 15.

Mockito

Mock을 지원하는 프레임워크로 Mock 객체를 만들고 관리하고 검증 할 수 있는 방법 제공합니다. 쉽게 가짜 객체를 만들어준다고 생각하면 됩니다. 구현체가 아직 없는 경우나, 구현체가 있더라도 특정 단위만 테스트 하고 싶을 경우 주로 사용하게 됩니다.

Mock이란
한글로 "모의, 가짜의" 라는 뜻으로 테스트할 때 필요한 실제 객체와 동일한 모의 객체를 만들어 테스트의 효용성을 높이기 위해 사용하는 것을 말합니다.

🏷️ Mock 객체 만드는 법

✅ Mockito.mock(만들고자 하는 객체 타입.class)

public class ListTest {

    @Test
    void simpleTest() {
        List listMock = mock(List.class);
        when(listMock.size()).thenReturn(3);

        assertEquals(3, listMock.size());
    }
}

@Mock 어노테이션

@ExtendWith(MockitoExtension.class)
class SomeBusinessImplMockTest {

    @Mock
    private DataService dataServiceMock;

    @InjectMocks
    private SomeBusinessImpl businessImpl;

    // 생략

}

클래스에 @ExtendWith(MockitoExtension.class)를 붙여주고 멤버변수에 @Mock을 붙여주어야 합니다. 또한 아래 처럼 파라미터로 넘길 수 있습니다.

@Test
void test(@Mock MemberService memberService, @Mock StudyRepository studyRepository) {
    StudyService studyService = new StudyService(memberService, studyRepository);
}

 

@Mock: mock 객체를 만들어서 반환합니다.
@InjectMocks: @Mock이나 @Spy 객체를 자신의 멤버 클래스와 일치하면 주입시킵니다.

🏷️ Mock 객체 행동 관리

Mock 객체를 만들었으면 테스트 할 행동이 어떻게 진행될 것인지에 대해 가정이 필요합니다. 이때 Mock객체의 행동을 조작하는 것을 Stubbing 이라고 합니다.

 

즉, 특정한 매개변수를 받았을 때, 특정한 값을 리턴하거나 예외를 던지도록 설정할 수 있으며 void 메소드 호출시 예외를 던질 수 있습니다. 또한 동일한 메소드가 여러번 호출될 때, 각각 다르게 행동하도록 할 수 있습니다.

// 사용된 class
public class SomeBusinessImpl {
    private DataService dataService;

    public SomeBusinessImpl(DataService dataService) {
        this.dataService = dataService;
    }

    public int findTheGreatestFromAllDate() {
        int[] data = dataService.retrieveAllDate();
        int greateValue = Integer.MIN_VALUE;

        for(int value : data) {
            if(value > greateValue) {
                greateValue = value;
            }
        }

        return greateValue;
    }
}

interface DataService {
    int[] retrieveAllDate();
}

 

@Test
void findTheGreatestFromAllDate_basicScenario() {25, 15, 5}{
    // 위의 retrieveAllDate() 메서드가 호출될 {25, 15, 5} 값을 리턴
    when(dataService.retrieveAllDate()).thenReturn(new int[] {25, 15, 5});
    assertEquals(25, businessImpl.findTheGreatestFromAllDate());
}
// .thenReturn()이나 .thenThrow()를 이어 붙여서 사용합니다.
when()
Mockito 라이브러리에서 제공하는 메서드로, 모의 객체(Mock)를 사용할 때 해당 객체의 메서드가 특정한 매개변수로 호출될 때 어떤 값을 반환하도록 설정하는 데 사용됩니다.

📖 Reference

max9106

JDM's Blog

'코딩 공부 > web & Java' 카테고리의 다른 글

[Spring] AOP  (1) 2024.01.05
[Java] 테스트 더블(Test Double) (feat. Mock, Stub)  (1) 2023.12.16
[Java] JUnit  (0) 2023.12.12
[Web] JWT  (1) 2023.12.08
[Spring/Web] CSRF  (1) 2023.12.04