Spring/테스트코드

단위 테스트, 통합 테스트

doriver 2024. 8. 13. 17:14

단위 테스트

하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 테스트 

서버의 특성상 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;
   
    ~
}