Home @Mock, @MockBean, @InjectMocks
Post
Cancel

@Mock, @MockBean, @InjectMocks

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);