Spring 통합 테스트

2022. 2. 25. 23:40Spring 기초

기존의 테스트 코드는, 해당 테스트 클래스 내에서 단독으로 진행되었다.

이번에는 Spring 서버를 띄운 상태로 테스트를 진행하였다.

 

1. @SpringBootTest

이 어노테이션은 Spring Main Application(@SpringBootApplication 어노테이션)을 찾은 뒤 동일 패키지의 하위 모든 Bean을 찾아온다.

package first.firstspring;

@SpringBootApplication
public class FirstSpringApplication {

   public static void main(String[] args) {
      SpringApplication.run(FirstSpringApplication.class, args);
   }

}

*Bean을 스프링이 자동으로 탐색한 뒤 컨테이너에 등록한다. 탐색 범위는 첫 줄 패키지부터 시작하여 하위 경로로 내려간다.

따라서, 설정 정보가 담긴 클래스는 상위 패키지에 두는 것이 좋다. 하위 Bean 중 제외하고 싶은 Bean은 filter를 사용해 등록에서 제외할 수 있다.

@ComponentScan(
 basePackages = "hello.demo",
}

@ComponentScan{
 basePackages = {"hello.demo", "hello.service"}      // 중복 정의가 가능하다.
}

basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.

만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

 

@Configuration
 	@ComponentScan(
 		includeFilters = @Filter(type = FilterType.ANNOTATION, classes =
							MyIncludeComponent.class),
		excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
							MyExcludeComponent.class)
 )

하위 경로 중, @MyIncludeComponent 어노테이션이 붙어있는 Bean은 컨테이너에 등록하고, @MyExcludeComponent가 붙어있는 Bean은 제외하는 코드다.

type은 기본값이 FilterType.ANNOTATION으로 (생략가능) 어노테이션 형식으로 붙어있는 케이스를 상정한다.

*includeFilters 속성은 @Component 으로 대체가 가능하다..

 

 

2. @Transactional

테스트 코드에서는 데이터베이스 정보가 테스트 이후 자동으로 rollback되어, 테스트에서 상태 의존성이 제거된다. 각각의 메서드에 모두 동작한다테스트 코드가 성공하고, DB에서 업데이트를 확인하고 싶다면 @Commit 어노테이션으로 DB에 커밋하는 과정이 추가로 필요하다.

 

테스트 코드가 아닌, Main 코드에서 @Transactional은 조금 다른 역할을 수행한다. 프록시 관련 게시글에 간단히 정리하였다.

 

 

 

 

'Spring 기초' 카테고리의 다른 글

AOP(Aspect Oriented Programming)  (0) 2022.03.02
Spring JDBC Template  (0) 2022.02.25
스프링 웹 개발 방식 - 정적컨텐츠, MVC 패턴, API  (0) 2022.02.16
Cookie & Session  (0) 2022.02.09
DataBinder(아주 간략)  (0) 2022.02.06