단위 테스트, 통합 테스트
단위 테스트
하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 테스트
서버의 특성상 Controller, Service, Repository, Entity 에 대해 생각해 볼수 있다
DomainTest
Entity객체 잘 생성되는지 등등 Entity클래스에 대한 확인
테스트코드에서 그냥 메소드에 @Test만 붙이고
RepositoryTest
CRUD잘 되는지 테스트
@DataJpaTest사용 @Autowired로 Repository 받아옴, 실제JPA동작
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("test")
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
~
}
ServiceTest
Service클래스에 작성된 코드가 제대로 동작하는지 test, Service에서 Repository객체가 사용되는데 test에선 가짜객체로 해줄수 있다.
@MockBean으로 협력자를 가짜 객체로 만듦, test주체인 Service는 직접 선언해서 생성
Mockito.when( ~ ).thenReturn( ~ ); 등으로 가짜 객체의 로직에 대해 응답을 정의
@ExtendWith(SpringExtension.class)
public class MemberServiceTest {
MemberService memberService; // Test 주체
@MockBean // 가짜 객체를 만드는 역할, 가짜 객체이므로 응답을 정의해줘야 함
MemberRepository memberRepository; // Test 협력자
@BeforeEach // 각각의 @Test실행 전 실행됨
void setUp() {
memberService = new MemberServiceImpl(memberRepository);
}
~
}
ControllerTest
요청과 응답에 대한 테스트, Mvc테스트( 컨트롤러가 설계대로 동작하는지에 대해 검증 )
@WebMvcTest 사용, 특정 Controller를 선택, ControllerAdvice, Filter 등을 포함과 제외시킬 수 있어 Security에 대한 Test도 가능
MockMvc로 실제 Controller에게 요청을 보낼수 있음, MockMvc는 테스트때 생성되는 WebApplicationContext에서 주입받는다.
@WebMvcTest(MemberController.class)
public class MemberControllerTest {
@Autowired
MockMvc mvc;
@MockBean
MemberServiceImpl memberService;
~
}
통합 테스트
실제 spring을 실행했을 때와 같은 운영환경에서 잘 동작하는지 확인하는 테스트
@SpringBootTest 사용
Spring에 쓰이는 Bean들이 실제로 등록됨 > 가짜 객체 만들필요없이 의존성 주입만 되게하면 됨
@SpringBootTest
@ActiveProfiles("test")
@Transactional
public class MemberServiceTest {
@Autowired
MemberService memberService;
~
}