테스트 코드

수정이·2022년 11월 1일
0

Spring

목록 보기
15/16
post-thumbnail

통합 테스트

통합 테스트는 단위 테스트와 달리 개발자가 변경할 수 없는 부분(외부 라이브러리)까지 묶어 검증할 때 사용한다. DB에 접근하거나 전체 코드와 다양한 환경이 제대로 동작하는지 확인하는데 필요한 모든 작업을 수행할 수 있다.

  • 장점은 단위 테스트에서 발견하기 어려운 버그를 찾을 수 잇다는 점이다.
  • 단점은 단위 테스트보다 더 많은 코드를 테스트하기 때문에 신뢰성이 떨어질 수 있다는 점이다.

SpringBoot에서는 클래스 상단에 @SpringBootTest를 붙여 통합 테스트를 수행할 수 있다.
그리고 @Autowired로 컴포넌트로 등록한 클래스들을 가져올 수 있다.

@SpringBootTest
class AuthServiceTest {

    @Autowired
    private AuthService authService;

    @Autowired
    private EncryptService encryptService;

    @Autowired
    private RedisService redisService;

    @Autowired
    private PasswordEncoder encoder;

    @Autowired
    private MemberRepository memberRepository;

단위 테스트

단위 테스트는 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트이다. 일반적으로 클래스 또는 메소드 수준으로 정해진다.

단위 테스트에 사용되는 어노테이션

service, controller, repository

  • @ExtendWith(MockitoExtension.class) : Junit5부터 사용되는 어노테이션으로 service 테스트를 할 때 사용한다. Mockito의 Mock 객체를 사용하기 위한 어노테이션이다. 테스트를 할 클래스 위에 달아준다.
    • @ExtendWith (SpringExtension.class) : Spring TestContext Framework의 기능을 Junit5에 통합하는 역할을 한다.
  • @WebMvcTest(-Controller.class) : 괄호안에 controller를 지정하면 해당 컨트롤러를 테스트 할 수 있다.
  • @DataJpaTest : Repository, service 테스트 시 같이 사용되며, Jpa를 테스트할 때 사용한다.

클래스 내부에 사용되는 어노테이션

  • @MockBean : 해당 Bean이 붙은 클래스에 관해서 MockContext에 등록한다. 이 어노테이션을 붙여 사용하는 객체에 관해서는 @InjectMocks이 작동하지 않는다. 이 객체는 Mock 객체이므로 행동을 정의해 주어야한다.
  • @Mock : 가짜 객체를 만들어주는 어노테이션이다. @InjectMocks이 붙은 객체 속에 해당 타입이 맞을 시 자동 주입해준다. 이 객체는 Mock 객체 이므로 행동(given, when)을 정의해 주어야한다.
  • @InjectMocks : @Mock이나 @Spy가 붙은 클래스를 주입해준다.
  • @SpyBean : 해당 클래스에 관한 모든 기능을 주입받는다. @Autowired와 비슷하다.
  • @Spy : spy 객체를 만들어 반환한다. 실제 인스턴스를 사용해서 mocking한다. 행동(given, when)을 정의해주지 않으면 실제 인스턴스의 메서드를 호출한다.

참고

단위 테스트 vs 통합 테스트 vs 인수 테스트
Spring Junit5 Test정리

profile
공부는 꾸준히... 글쓰기도 꾸준히...

0개의 댓글