1. 개요
이 빠른 자습서에서는 Mockito 및 Spring 모의 지원을 사용하여 모의 객체를 만드는 세 가지 방법과 서로 어떻게 다른지 살펴볼 것입니다.
2. Mockito.mock ()
Mockito.mock () 메소드는, 우리가 클래스 또는 인터페이스의 모의 객체를 생성 할 수 있습니다.
그런 다음 mock을 사용하여 메서드에 대한 반환 값을 스텁하고 호출되었는지 확인할 수 있습니다.
예를 살펴 보겠습니다.
@Test
public void givenCountMethodMocked_WhenCountInvoked_ThenMockedValueReturned() {
UserRepository localMockRepository = Mockito.mock(UserRepository.class);
Mockito.when(localMockRepository.count()).thenReturn(111L);
long userCount = localMockRepository.count();
Assert.assertEquals(111L, userCount);
Mockito.verify(localMockRepository).count();
}
이 방법은 사용하기 전에 다른 작업을 수행 할 필요가 없습니다. 메서드에서 모의 클래스 필드와 로컬 모의를 만드는 데 사용할 수 있습니다.
3. Mockito의 @Mock 어노테이션
이 어노테이션은 Mockito.mock () 메서드 의 약어입니다 . 또한 테스트 클래스에서만 사용해야합니다. 달리 모의 () 방법, 우리는이 어노테이션을 사용하는 Mockito 어노테이션을 활성화해야합니다.
MockitoJUnitRunner 를 사용 하여 테스트를 실행하거나 MockitoAnnotations.initMocks () 메서드를 명시 적으로 호출하여 이를 수행 할 수 있습니다 .
MockitoJUnitRunner 를 사용한 예를 살펴 보겠습니다 .
@RunWith(MockitoJUnitRunner.class)
public class MockAnnotationUnitTest {
@Mock
UserRepository mockRepository;
@Test
public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() {
Mockito.when(mockRepository.count()).thenReturn(123L);
long userCount = mockRepository.count();
Assert.assertEquals(123L, userCount);
Mockito.verify(mockRepository).count();
}
}
코드를 더 읽기 쉽게 만드는 것 외에도 @Mock을 사용하면 실패 메시지에 필드 이름이 표시되므로 실패시 문제 모의를 쉽게 찾을 수 있습니다.
Wanted but not invoked:
mockRepository.count();
-> at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22)
Actually, there were zero interactions with this mock.
at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22)
또한 @InjectMocks 와 함께 사용하면 설정 코드의 양을 크게 줄일 수 있습니다.
4. Spring Boot의 @MockBean 어노테이션
@MockBean 을 사용하여 Spring 애플리케이션 컨텍스트에 모의 객체를 추가 할 수 있습니다 . mock은 애플리케이션 컨텍스트에서 동일한 유형의 기존 Bean을 대체합니다.
동일한 유형의 Bean이 정의되지 않은 경우 새 Bean이 추가됩니다. 이 어노테이션은 특정 Bean (예 : 외부 서비스)을 모의해야하는 통합 테스트에 유용합니다.
이 어노테이션을 사용하려면 SpringRunner 를 사용 하여 테스트를 실행해야합니다.
@RunWith(SpringRunner.class)
public class MockBeanAnnotationIntegrationTest {
@MockBean
UserRepository mockRepository;
@Autowired
ApplicationContext context;
@Test
public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() {
Mockito.when(mockRepository.count()).thenReturn(123L);
UserRepository userRepoFromContext = context.getBean(UserRepository.class);
long userCount = userRepoFromContext.count();
Assert.assertEquals(123L, userCount);
Mockito.verify(mockRepository).count();
}
}
필드에 어노테이션 을 사용하고 애플리케이션 컨텍스트에 등록 할 때 mock도 필드에 삽입됩니다.
이것은 위의 코드에서 분명합니다. 여기에서는 삽입 된 UserRepository 모의를 사용 하여 count 메서드 를 스텁합니다 . 그런 다음 응용 프로그램 컨텍스트의 빈을 사용하여 실제로 모의 빈인지 확인했습니다.
5. 결론
이 기사에서 우리는 모의 객체를 만드는 세 가지 방법이 어떻게 다른지, 그리고 각각이 어떻게 사용될 수 있는지 살펴 보았습니다.