스프링 테스트를 작성하면 기존에 있는 테스트 코드를 참고해서 유사하게 만드는 경우가 많다
그러는 중간에 @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와 같은 어노테이션을 사용하여서 생성자를 통해 객체를 생성하지 않고 간편하게 사용할 수도 있다.