통합 테스트는 단위 테스트와 달리 개발자가 변경할 수 없는 부분(외부 라이브러리)까지 묶어 검증할 때 사용한다. 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;
단위 테스트는 응용 프로그램에서 테스트 가능한 가장 작은 소프트웨어를 실행하여 예상대로 동작하는지 확인하는 테스트이다. 일반적으로 클래스 또는 메소드 수준으로 정해진다.
@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)을 정의해주지 않으면 실제 인스턴스의 메서드를 호출한다.