상세 컨텐츠

본문 제목

[jUnit 5] Spring legacy 통합 테스트

JAVA/WEB - Spring

by 개봉박살 2021. 5. 22. 01:26

본문

 

1. dependency

<!-- jUnit5 -->
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-api</artifactId>
  <version>5.7.0</version>
  <scope>test</scope>
</dependency>

<!-- mockito -->
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-junit-jupiter</artifactId>
  <version>3.2.4</version>
  <scope>test</scope>
</dependency>

주의

"java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig" 오류가 발생하면 

servlet-api버전을 3.1.0 이상으로 올려야 한다.

 

2. 서버 구성

  2-1. HomeController

@RestController
public class HomeController {
	
	@Autowired
	MemberService mService;
	
	@GetMapping(path = "/select")
	public Member select(Member member) {
		Member mem = mService.select(member);
		return mem;
	}
}

 

  2-2. MemberService

@Service
public class MemberService {

	@Autowired
	MemberRepository mRepo;
	
	public Member select(Member member) {
		member = mRepo.findById(member.getId()).get();
		return member;
	}
}

 

  2-3. MemberRepository

public interface MemberRepository extends JpaRepository<Member, Long>{
}

 

 

  2-4. Member

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name="member")
public class Member {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY, generator="CUST_SEQ")
	private Long id;
	private String name;
	private String email;
	
	@CreationTimestamp
	@JsonFormat(pattern = "yyyy-MM-dd kk:mm:ss")
	@JsonDeserialize(using = LocalDateTimeDeserializer.class)
	private LocalDateTime create_date;
}

 

3. 테스트 코드 작성

@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/appServlet/*"})
class HomeControllerTest {
	
	@Autowired
	HomeController homeController;
	
	MockMvc mockMvc;

	@BeforeEach
	public void before() {
	  	mockMvc = MockMvcBuilders.standaloneSetup(homeController)
	  				.addFilter(new CharacterEncodingFilter(StandardCharsets.UTF_8.name(), true))
	           	    .build();
	}
	
	@Test
	void controllerTest() throws Exception {
		mockMvc.perform(get("/select?id=2"))
			.andExpect(MockMvcResultMatchers.status().isOk())
			.andDo(print());
	}
}

 

!!! - @ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/appServlet/*"}) - 설정 로드

   - 테스트 빈 주입을 하려면 따로 설정파일을 작성해서 테스트용 DB등을 설정 할 수있다.

 

!!! - @BeforeEach - 테스트 시작시 mockMvc 객체 생성 - 서버를 구동하지 않고 리퀘스트 요청을 처리 할 수있게 도와준다.

 

!!! - .addFilter(new CharacterEncodingFilter(StandardCharsets.UTF_8.name(), true)) - 인코딩 설정

 

!!! - mvc.perform(get("/select?id=2")) - get메소드로 리퀘스트를 수행한다.

 

!!! - .andExpect(MockMvcResultMatchers.status().isOk()) - 리퀘스트가 정상적으로 수행됐는지 확인한다(response code : 200) 

 

!!! - .andDo(print()); - 리퀘스트 수행결과를 출력한다.

 

----

우리가 Spring Legacy 프로젝트에서 테스트 케이스 작성법은 찾아봐도 잘 나오지 않는다.

그리고 jUnit5가 공개된지도 짧지않은 시간이 지났고, 프레임워크로서 자리도 잘 잡아가고 있다.

그런 의미에서 Spring Legacy 프로젝트에서 통합테스트와 단위테스트를 하나씩 포스팅하려고한다.

관련글 더보기

댓글 영역