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. 결론

이 기사에서 우리는 모의 객체를 만드는 세 가지 방법이 어떻게 다른지, 그리고 각각이 어떻게 사용될 수 있는지 살펴 보았습니다.

이 기사와 함께 제공되는 소스 코드는 GitHub에서 사용할 수  있습니다 .