Spring에서 단위테스트와 통합테스트시 객체 생성에 사용하는 애너테이션인 @Mock
, @MockBean
, @InjectMocks
에 대해서 알아보자.
@Mock
- Mock 객체를 직접 생성하여 사용하는 애너테이션으로, 스프링 컨텍스트와 관련이 없는 순수 객체이다.
@MockBean
- Mock 객체를 생성하고, Bean이므로 스프링 컨텍스트에 등록을 한다.
- 스프링 컨텍스트에 직접 생성하므로, 관련된 객체와 연결하여 통합 테스트를 수행할 수 있다.
통합 테스트에서 컨테이너가 필요하고, 빈을 등록해야한다면 @MockBean
을 통해 등록해주면 되고,
단위 테스트 같이 컨테이너가 필요 없다면 @Mock
을 통해 객체를 만들어주면 된다.
@InjectMocks
테스트 대상 클래스에 자동으로 @Mock
으로 만들어진 객체들을 의존성으로 주입하여, 클래스 내부에서 의존하는 객체들을 Mock으로 대체합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
// 실제 테스트 대상 클래스
@InjectMocks
private UserService userService;
// UserService에서 의존하고 있는 Repository 클래스에 대한 Mock 객체
@Mock
private UserRepository userRepository;
@Test
public void testGetUserById() {
when(userRepository.findById(1L)).thenReturn(Optional.of(new User(1L, "John")));
User user = userService.getUserById(1L);
assertEquals("John", user.getName());
}
}
@InjectMocks
는 아래와 같이 생성자에 인자로 인스턴스를 주입해는 코드와 같다.
1
2
UserRepository userRepository = new UserRepository();
UserService userService = new UserService(userRepoistory);