Mockito는 유닛 테스트에서 모의 객체를 생성할 수 있게 해줍니다. 이를 통해서 의존성 및 동작의 모의 객체를 생성하여 컴포넌트의 기능을 독립적으로 테스트 할 수 있습니다. 그리고 MockitoExtension은 spring Framework와 통합되는 Mockito의 확장 프레임워크입니다. 이번 글에서는 MockitoExtension에 대한 정리와 간단한 사용법등을 알아보겠습니다.
MockitoExtension이란?
MockitoExtension은 Spring Framework와 통합되는 Mockito 프레임워크의 확장 프레임워크입니다. @Mock 어노테이션을 사용하여 Spring이 관리하는 컴포넌트에 모의 객체(mock objects)를 자동으로 주입할 수 있습니다. 이는 개발자가 유닛 테스트에서 모의 객체를 수동으로 컴포넌트에 연결하지 않아도 되도록 해줍니다.
MockitoExtension은 JUnit 5 이상에서 사용할 수 있으며 Spring Framework에서 기본적으로 제공됩니다.
MockitoExtension 사용하기
MockitoExtension을 사용하려면, 우선 Spring Framework과 Mockito를 프로젝트에 추가해야 합니다. 다음으로, JUnit 5의 @ExtendWith 어노테이션을 사용하여 MockitoExtension을 확장자(extension)으로 등록합니다.
일단 다음과 같이 MyService라는 서비스 클래스가 있다고 가정해봅시다.
public class MyService {
private MyRepository myRepository;
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
public String doSomething() {
// ...
String result = myRepository.getData();
// ...
return result;
}
}
MyService 클래스에서는 MyRepository라는 의존성을 주입받아 사용합니다. 이를 테스트하기 위해 MyServiceTest 클래스에서 MyService 객체를 mock으로 만들어 테스트를 수행할 수 있습니다. 이때 @Mock 어노테이션으로 MyRepository mock 객체를 생성하고, @InjectMocks 어노테이션으로 MyService 객체를 생성하면 MockitoExtension에서 자동으로 mock 객체를 주입합니다.
@ExtendWith(MockitoExtension.class)
public class MyServiceTest {
@Mock
private MyRepository myRepository;
@InjectMocks
private MyService myService;
@Test
public void testDoSomething() {
// Given
when(myRepository.getData()).thenReturn("Mocked Data");
// When
String result = myService.doSomething();
// Then
assertEquals("Mocked Data", result);
}
}
위의 예제에서 MyServiceTest 클래스에서 @Mock 어노테이션을 사용하여 MyRepository mock 객체를 생성하고, @InjectMocks 어노테이션으로 MyService 객체를 생성합니다. 이때 MockitoExtension에서 자동으로 MyRepository mock 객체를 MyService 객체에 주입합니다.
테스트 메소드에서는 when 메서드를 사용하여 myRepository.getData() 메서드가 호출될 때 "Mocked Data" 값을 반환하도록 설정합니다. 그리고 myService.doSomething() 메소드를 호출하여 result 변수에 반환값을 저장한 후, assertEquals 메서드를 사용하여 반환값이 "Mocked Data"인지 검증합니다.
이를 통해 MockitoExtension을 사용하여 @Mock 어노테이션으로 mock 객체를 생성하고, @InjectMocks 어노테이션으로 의존성이 주입되는 객체를 생성하면, 더욱 간결하고 유지보수가 용이한 유닛 테스트를 작성할 수 있습니다.
Mockito 메서드
when
when 메서드는 모의 객체의 메서드가 호출될 때, 어떤 값을 반환하도록 설정합니다. 예를 들어, 다음과 같이 when 메서드를 사용하여 myDependency.doSomething() 메서드가 호출될 때 "hello"라는 값을 반환하도록 설정할 수 있습니다.
MyDependency myDependency = mock(MyDependency.class);
when(myDependency.doSomething()).thenReturn("hello");
given
given 메서드는 when 메서드와 함께 사용되어 모의 객체의 메서드가 호출될 때, 반환할 값을 정의합니다.
MyDependency myDependency = mock(MyDependency.class);
given(myDependency.doSomething()).willReturn("hello");
when과 given은 기능적으로는 거의 동일하지만 사용 방법이 약간 다릅니다.
given 메소드는 BDD 스타일의 문법을 사용하여 읽기 쉽고 이해하기 쉽게 만들어주며, when 메소드는 기본 Mockito 스타일의 문법을 사용합니다.
verify
verify 메서드는 모의 객체의 메서드가 특정 횟수만큼 호출되었는지 검증합니다. 예를 들어, 다음과 같이 verify 메서드를 사용하여 myDependency.doSomething() 메서드가 정확히 한 번 호출되었는지 검증할 수 있습니다.
MyDependency myDependency = mock(MyDependency.class);
// ...
verify(myDependency, times(1)).doSomething();
any
any 메서드는 매개변수를 무시하고 모든 값을 받아들입니다. 예를 들어, 다음과 같이 any 메서드를 사용하여 myDependency.doSomething 메서드가 어떤 매개변수를 받더라도 "hello"라는 값을 반환하도록 설정할 수 있습니다.
MyDependency myDependency = mock(MyDependency.class);
when(myDependency.doSomething(any())).thenReturn("hello");
ArgumentCapter
ArgumentCaptor는 모의 객체의 메서드가 호출될 때 전달된 매개변수를 캡처합니다. 이를 통해 유닛 테스트에서 전달된 매개변수를 검증할 수 있습니다. 예를 들어, 다음과 같이 ArgumentCaptor를 사용하여 myDependency.doSomething 메서드가 호출될 때 전달된 매개변수를 캡처하고, 이를 검증할 수 있습니다.
MyDependency myDependency = mock(MyDependency.class);
// ...
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(myDependency).doSomething(argument.capture());
assertEquals("hello", argument.getValue());
위에서는 ArgumentCaptor를 사용하여 String 타입의 매개변수를 캡처하고, assertEquals 메서드를 사용하여 캡처된 매개변수가 "hello"인지 검증합니다.
'spring > study' 카테고리의 다른 글
[Spring] @Data 에 대해서 알아보자 (0) | 2023.02.25 |
---|---|
[Spring] Swagger에 대해서 알아보자 (0) | 2023.02.23 |
[Spring] @EnableWebSecurity 에 대해서 알아보자 (0) | 2023.02.16 |
[Spring] @OnDelete 에 대해서 알아보자 (0) | 2023.02.16 |
[Spring] @Query 에 대해서 알아보자 (0) | 2023.02.15 |