본 글에서는 spring Mock Test에 대해 다룹니다.
spring에서 일반적으로 생성한 클래스들에 대해 테스트를 할때, 테스트 클래스위에 @SpringbootTest 어노테이션을 명시하여 통합테스트 합니다.
그런데, 통합테스트는 테스트가 필요한 클래스외에 나머지들도 전부 구동시키기 때문에, 테스트 속도가 매우 느려지는 단점이 있으며, 또한 테스트하려는 클래스외에 다른 클래스에서 에러가 발생했을때도 테스트 클래스를 실행할 수 없는 단점이 있습니다.
이러한 통합테스트의 단점을 해결하기 위해 단위 테스트가 필요할 때가 있는데, 이때 Mock test가 쓰입니다.
정확히는 단위테스트 중에서, 타 클래스 의존성 주입이 필요한 클래스의 테스트가 필요할때 사용할 수 있습니다.
Controller -> Service -> Repository 와같이 일반적인 구조에서, Service 클래스를 테스트하려면 Repository에 대한 의존성 주입을 해야하며, Controller 클래스를 테스트하려면 Service 의존성 주입을 해야합니다.
의존성주입을 위해서는 단순히 @SpringbootTest 추가 후, @Autowired 어노테이션을 통해 주입할 수 있지만, 단위 테스트를 위해서는 다른 방식이 필요합니다.
spring에서는 기본적으로 mockito 를 제공하기 때문에, pom.xml에 추가적으로 명시할 필요없이 바로 사용할 수 있습니다.
- 테스트 코드
1) 테스트 클래스 상단에 @ExtendWith(MockitoExtension.class) 어노테이션 추가
2) @InjectMocks 어노테이션을 통해 의존성을 주입받을 클래스 명시
3) @Mock 어노테이션을 통해 가짜 데이터를 만들 클래스 명시
4) Mockito.doReturn(tempList).when(itemRepository).findByItemName("testName");
위 코드를 통해, itemRepository에서 findByItemName이라는 메서드를 "testName"이라는 파라미터로 호출했을때, 미리 준비해놓은 tempList라는 객체를 return해라 라는 식으로 작성합니다.
실제 서비스에서는 Repository에서 db를 조회해서 findByItemName 메서드에 대한 리턴값을 보여주지만, 가짜 객체를 return 하는 형식입니다.
@ExtendWith(MockitoExtension.class)
class ItemJpaServiceTest {
@InjectMocks
private ItemJpaService itemJpaService;
@Mock
private ItemRepository itemRepository;
@Test
void findAll() {
//given
Item item = new Item();
item.setId(1L);
item.setItemName("testName");
item.setPrice(10000);
item.setQuantity(100);
ArrayList<Item> tempList = new ArrayList<>();
tempList.add(item);
//when
Mockito.doReturn(tempList).when(itemRepository).findByItemName("testName");
List<Item> itemList = itemRepository.findByItemName("testName");
Assertions.assertThat(itemList).isEqualTo(tempList);
}
}
- 테스트 결과
'spring' 카테고리의 다른 글
spring EventListener에서 @Async 비동기 적용 (0) | 2023.07.31 |
---|---|
spring cloud config로 yml파일 배포없이 변경해보기 (0) | 2023.07.23 |
spring event pub/sub 구현 (0) | 2023.07.22 |
spring application.yml파일 설정값 적용 (0) | 2023.07.21 |
spring jwt 인증인가 인터셉터 만들기 (0) | 2023.07.08 |
spring 쓰레드로컬(ThreadLocal) (0) | 2023.07.08 |
spring jwt 토큰 발급하는 restapi 만들기 -2 (0) | 2023.07.05 |
spring security로 ID/PASSWORD 로그인 구현하기 (2) | 2023.06.28 |
댓글