이 빠른 튜토리얼에서는 Mockito와 Spring 모의 지원을 사용하여 모의 객체를 생성하는 세 가지 방법을 살펴보겠습니다. 또한 서로 어떻게 다른지 논의하겠습니다.
Mockito.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();
}
이 메서드를 사용하기 전에 다른 작업을 수행할 필요는 없습니다. 이를 사용하여 모의 클래스 필드와 메서드의 로컬 모의를 생성할 수 있습니다.
이 어노테이션은 Mockito.mock() 메서드의 약어입니다. 테스트 클래스에서만 사용해야 한다는 점을 기억하는 것이 중요합니다. 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와 함께 사용하면 설정 코드의 양을 크게 줄일 수 있습니다.
@MockBean Annotation@MockBean을 사용하여 Spring 애플리케이션 컨텍스트에 모의 객체를 추가할 수 있습니다. 모의 객체는 애플리케이션 컨텍스트에서 동일한 유형의 기존 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();
}
}
필드에 주석을 사용하면 모의 객체가 필드에 주입되고 애플리케이션 컨텍스트에 등록됩니다.
이는 위의 코드에서 분명하게 드러납니다. 여기서 우리는 주입된 UserRepository 모의를 사용하여 count 메소드를 스텁했습니다. 그런 다음 애플리케이션 컨텍스트의 Bean을 사용하여 실제로 mock된 Bean인지 확인했습니다.