인프런 커뮤니티 질문&답변

jeukoh님의 프로필 이미지
jeukoh

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 통합 테스트

@SpringBootTest 어노테이션 없이 순수 자바 코드 테스트를 할 때,

작성

·

877

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.w2tomwsznga7)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://docs.google.com/document/d/1xCQKit-1V6l6ObeCe49St33RHPzLF_P_c3o7aSDTKs0/edit#heading=h.7dhnp46ven0v)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

안녕하세요, 명강의 잘 듣고있습니다.
 
통합테스트 단계에선 BeforeEach, AfterEach 어노테이션을 사용안하고 @SpringBootTest 어노테이션을 활용하여 바로 Service, Repository 빈들을 주입 받는데요.
 
강사님께서 실무에선 자바 코드 테스트를 더욱 활용하시라고 말씀하셔서 자바 코드 테스트를 통합 테스트와 같은 코드로 실행해보았습니다. (@SpringBootTest 어노테이션만 지우고 실행)
 
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
 
빈을 주입하는 코드로는 멤버를 선언한 뒤
Long saveId = memberService.join(member);
하는 부분에서 NPE 에러가 발생하더라구요.
 
제 생각에는 자바 코드 테스트에서는 스프링 서버가 실행되지 않아컨테이너나 빈의 개념이 없어서 생기는 문제라고 생각하였습니다.
 
질문은
1. MemberService 클래스가 따로 임포트 된 것이 아닌데, 선언에서 에러가 난 것이 아니라, join 메서드에서 NPE 에러가 나는 이유?
 
2. 실무에서 자바 코드 테스트 사용을 지향하라고 말씀하셨는데, 그렇다면 실무에서도 예제와 같이 객체 선언을 스프링 빈을 활용하지 않고 테스트 코드 상에서 하고, BeforeEach, AfterEach를 활용하는 것이 최선인지 아니면 보다 좋은 방법이 있는지 궁금합니다. @Transactional 어노테이션을 활용한 테스트가 너무 매력적이더라구요.
 
감사합니다.
 
 

답변 1

1

안녕하세요. jeukoh님, 공식 서포터즈 David입니다.

.
1. MemberService의 import문이 없는 것은 아래 블로그를 참고해주세요.

https://deeplyrooted.tistory.com/1

2. 일반적으로 통합테스트의 경우 스프링을 띄워 빈을 주입 받아서 사용합니다. 단위테스트의 경우 스프링 개입없이 도메인 로직을 테스트합니다.

.
감사합니다.

jeukoh님의 프로필 이미지
jeukoh
질문자

같은 패키지를 자동으로 임포트하는 것이군요. 감사합니다!

2번은 단위 테스트에서 DB를 사용할 땐 BeforeEach, AfterEach를 활용하는 것이 최선이라는 것으로 이해하겠습니다. 아니면 mockito 라이브러리를 활용하여 BeforeEach, AfterEach 사용을 덜 하나요?

Rollback을 원하신다면 단위테스트는 아니지만 @DataJpaTest로 슬라이스 테스트를 하시면 될 것 같습니다.

jeukoh님의 프로필 이미지
jeukoh

작성한 질문수

질문하기