새소식

반응형
Spring/Test

[SpringTest] Mock, MockBean 차이점 알아보기

  • -
반응형

스프링 테스트를 작성하면 기존에 있는 테스트 코드를 참고해서 유사하게 만드는 경우가 많다

그러는 중간에 @Mock @MockBean 어노테이션을 다르게 사용하는 것을 발견하게 되었고 

이 둘의 차이가 궁금해져서 찾아본 내용을 정리해보자 

 

@MockBean 

import org.springframework.boot.test.mock.mockito.MockBean

MockBean은 스프링프레임워크의 어노테이션으로 스프링 콘텍스트를 테스트할 때 사용된다.

@Autowired와 같이 스프링 빈이 주입될 때 MockBean이 붙은 객체가 주입된다. 

-> Mock 객체를 생성하고, 스프링 컨텍스트에 등록을 한다

@SpringBootTest
public class MockTests {
    @MockBean
    private TestRepository testRepository;
    
    @Autowired
    private TestService testService;   
}

또한 테스트하고자 하는 객체에 주입받아야 할 MockBean들이 많을 때 사용하기 유용한 @MockBeans 어노테이션도 존재한다.

@MockBeans({
    @MockBean(TestParser.class),
    @MockBean(TestResponseGenerator.class)
})
@SpringBootTest
public class MockTests {
    // ... 
}

 

@Mock

import org.mockito.Mock

Mock은 mockito 라이브러리의 어노테이션으로 스프링 콘텍스트 등과의 연관 없이

순수하게 테스트를 위해서 가짜 객체를 생성하는 역할을 한다

보통 단위테스트를 할 때, 테스트하고자 하는 객체에만 집중하기 위해 이외의 것들은 Mock으로 선언하여 사용한다.

Mockito를 통한 테스트를 진행하기 때문에 테스트 클래스에 해당 여부를 표시해 주는 @ExtendWith 정보가 필요하다 (junit5)

@ExtendWith(MockitoExtension.class)
public class MockTests {
    @Mock
    private TestRepository testRepository;
    
    @InjectMocks
    private TestService testService;   
}

@Mock을 선언하고, 해당 객체가 생성될 때 필요한 생성자에 넣어서 사용하기도 하지만

@InjectMocks와 같은 어노테이션을 사용하여서 생성자를 통해 객체를 생성하지 않고 간편하게 사용할 수도 있다.

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.