테스트 코드

수정이·2022년 11월 1일
0

Spring

목록 보기
15/16
post-thumbnail
post-custom-banner

통합 테스트

통합 테스트는 단위 테스트와 달리 개발자가 변경할 수 없는 부분(외부 라이브러리)까지 묶어 검증할 때 사용한다. 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정리

post-custom-banner

0개의 댓글