관리 메뉴

개발하는 동그리

[Test] Mockito 본문

IT 정보/Spring

[Test] Mockito

개발하는 동그리 2022. 7. 14. 15:02
반응형

[중요 내용]

  • 테스트의 단위는 작을수록 좋다. 

 

Mockito 란?

  • Mock 객체로 Mocking을 할 수 있게 해주는 라이브러리가 바로 Mockito
  • Mock 객체를 사용하면, Controller 계층에서 실제 Service. Repository에 접근하지 않고 Mock Service 객체를 이용해 데이터 베이스에 접근할 수 있다. 즉 계층을 단절시켜 불필요한 과정을 줄일 수 있다. 

 

Mockito.mock() 메서드

아래와 같이 클래스 또는 인터페이스의 모의 객체를 만들 수 있다. 

UserRepository localMockRepository = Mockito.mock(UserRepository.class);

 

해당 인스턴스의 메서드에 대한 반환값을 스텁하고 호출되었는지 확인할 수 있다. 

Mockito.when(localMockRepository.count()).thenReturn(111L);

 

@Mock

  • Mockito.mock()의 약어이다. 
  • 테스트 클래스에서만 사용할 수 있다. 
  • @Mock 사용할 경우 오류 메세지에 필드값이 나타나서 오류를 찾기 쉽다. 
@Mock
    UserRepository mockRepository;

 

@MockBean 

  • Spring Application context에 mock객체를 추가할 수 있다.  ( 동일한 유형의 기존의 빈을 대체 )
  • 동일한 유형의 bean이 등록되어 있지 않을 경우엔 새로운 bean 등록
  • 외부서비스와 같은 특정 빈에서 통합테스트에 유용하다. 
  • @MockBean을 사용하기 위해서는 SpringRunner를 사용해서 실행해야 한다. 
  • count() 메서드를 스텁하기위해 UserRepository를 사용했다 
@RunWith(SpringRunner.class) // JUnit 테스트에 주석 추가 
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();
    }
}

 

Stub이란!? 

  • 정의되어있지 않거나, 구현되지 않은 함수 
  • 테스트중 준비된 호출에 대한 준비된 답을 제공하고 그 외에 항목에는 응답하지 않는다. 
  • 복잡한 논리 흐름을 단순화할 목적으로 사용
  • 입력값과 리턴값을 입력!
반응형

'IT 정보 > Spring' 카테고리의 다른 글

[Spring MVC] API 문서화  (16) 2022.07.18
[Spring] 스프링 MVC 정리 (1)  (10) 2022.07.16
[Test] TDD (Test-Driven Development)  (12) 2022.07.14
[스프링 부트와 JPA 활용] 2편  (0) 2022.07.14
[Spring] JUnit Test 기능  (18) 2022.07.12