Back-End/토비의 스프링3

토비의 스프링 6장(2) - 고립된 단위 테스트

taehyun_kim 2018. 11. 2. 17:25

고립된 단위 테스트

단위 테스트는 당연히 작은 단위어야 한다.


쉽고, 빠르고, 명확하기 때문이다. 


복잡한 의존관계 속의 테스트

테스트 대상의 의존구조에 대한 이미지 검색결과


UserService 테스트를 위해 필요한 구조

  • DB와 데이터를 주고 받기 위한 UserDaoJdbc
  • 트랜잭션 처리를 위한 Transaction Manager
  • 메일 전송을 위한 MailSender

문제점

간단한 UserService 테스트를 위해서는 DB, Transaction 등 의존 관계를 명시해줘야 한다.

테스트하기 복잡하고, 환경에 영향을 받는다.

테스트 대상 오브젝트 고립시키기


단위테스트 vs 통합테스트

둘 중에 어떤걸 써야할까?
  1. 항상 단위 테스트를 먼저 고려한다
  2. 외부 리스소를 사용해야 하는경우만 통합 테스트. 외부와의 의존관계는 모두 차단하고 필요에 따라 목 오브젝트 등의 테스트 대역을 이용

스프링이 권장하는 유연한 코드를 만들다보면 테스트도 그만큼 쉬워지고, 리팩토링도 쉽게 접근할 수 있게 된다.


목 프레임워크

Mockito 프레임워크

목 클래스를 일일이 준비해둘 필요가 없도록 도와주는 목 프레임워크이다.

UserDao mockUserDao = mock(UserDao.class);

when(mockUserDao.getAll()).thenReturn(this.users);


다음은 updates() 호출이 있었는지를 검증하는 부분이다.


verify(mockUserDao, times(2).update(any(User.class));


사용방법


1. 인터페이스를 이용해 목오브젝트 생성

2. 목 오브젝트가 리턴할 값이 있으면 이를 지정해 준다.

3. 테스트 대상 오브젝트에 DI해서 목 오브젝트가 테스트 중에 사용되도록 만든다.

4. 진짜 테스트