스프링 부트 테스트
spring init --package=com.apress.spring -g=com.apress.spring -a=spring-boot -name=spring-boot -x
pom.xml
<modelVersion>4.0.0</modelVersion> <groupId>com.apress.spring</groupId> <artifactId>spring-boot</artifactId> <version>0.0.1-SNAPSHOT</version> <package>jar</package> <name>spring-boot</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starer-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> |
spring-boot-starter-test는 스프링 이니셜라이저로 프로젝트를 생성할 때마다 항상 곁들여지는 스타터 폼으로, spring-test, junit, hamcrest, objenesis, mockito jar파일도 함께 가져온다.
스파크 같은 다른 테스트 프레임워크를 써도 된다.
스프링 이니셜라이저는 기본 테스트 클래스를 만든다.
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = SpringBootApplication.class) public class SrpingBootApplicationTests {
@Test public void contextLoads() { } } |
@RunWith(SpringJUnit4ClassRunner.class)
제이유닛 라이브러리의 @RunWith는 제이유닛 내장 실행기 runner 대신 SpringJUnit4ClassRunner.class 클래스를 참조하여 테스트를 실행한다.
이 클래스는 제이유닛의 BlockJUnit4ClassRunner를 커스텀 확장한 클래스로, 스프링 테스트 컨텍스트 프레임워크의 모든 기능을 제공하며 다음 애노테이션을 지원한다.
@Test(expected=...)
@Test(timeout=...)
@Timed
@Repeat
@Ignore
@ProfileValueSourceConfiguration
@IfProfileValue
SpringClassRule, SpringMethodRule 클래스를 써도 된다.
둘다 TestContext 프레임워크에서 클래스 레벨의 기능을 지원하는 TestRule의 커스텀 인터페이스고 @ClassRule과 @Rule 애노테이션을 함게 사용한다.
@SpringApplicationConfiguration(classes=SpringBootApplication.class)
ApplicationContext를 로딩/구성하는 방법을 정하는 클래스 레벨 애노테이션이다.
덕분에 @Autowired 애노테이션만 붙이면 모든 스프링 컨테이너 클래스에 직접 접근할 수 있다.
여기서는 메인 클래스 SpringBootApplication이 모든 연결 공사를 관장한다.
@Test
테스트할 메소드에 붙이는 애노테이션으로 여러 메소드에 붙여도 된다.
하지만 여러 메소드에 붙일경우 실행 순서가 보장되지 않는다.
@FixMethodOrder(MethodSorters.NAME_ASCENDING) 같은 애노테이션으로 순서를 지정한다.
스프링 부트 1.4버전부터 테스트 애노테이션이 단순하게 바뀌었다.
@RunWith(SpringRunner.class) @SpringBootTest public class SpringBootApplicationTests {
@Test public void contextLoads() { } } |
SpringRunner
SpringJUnit4ClassRunner를 상속한 클래스로 사실상 클래스 이름만 짧게 줄인 동일한 클래스이다.
@SpringBootTest
일반적인 스프링 부트 기반의 테스트 클래스에 붙이는 새 꼬리표(애노테이션)이다.
속성을 추가해서 애플리케이션에 따라 설정을 달리할 수 있다.
웹애플리케이션은 보통 @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)같이 webEnvironment속성으로 웹 환경 (web environment)을 모킹(mocking)하여 테스트를 수행한다.
웹테스트
서드파티 라이브러리를 이용해서 테스트 할 웹 애플리케이션 프로젝트를 생성
mkdir spring-boot-web
cd spring-boot-web
spring init -d=web,thymeleaf --package=com.apress.spring -g=com.apress.spring -a=spring-boot-web -name=spring-boot-web -x
-d=web,thymeleaf 파라미터를 추가
뷰엔진으로 타임리프를 사용하는 웹 프로젝트가 생성된다.
pom.xml
<modelVersion>4.0.0</modelVersion> <groupId>com.apress.spring</groupId> <artifactId>spring-boot</artifactId> <version>0.0.1-SNAPSHOT</version> <package>jar</package> <name>spring-boot-web</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starer-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> |
spring-boot-starter-web, spring-boot-start-thymeleaf 두 의존체가 생겼다.
자동생성된 테스트 클래스
@RunWith(SpringJUint4ClassRunner.class) @SpringApplicatioinConfiguration(Classes = SpringBootWebApplication.class) @WebAppConfiguration public class SpringBootWebApplicationTests {
@Test public void contextLoads(){ } } |
웹 애플리케이션 프로젝트라서 @WebAppConfiguration이라는 애노테이션이 테스트 클래스에 달려있다.
@WebAppConfiguratioin은 org.springframework.web.context.WebApplicationContext 구현체를 불러오는 클래스 레벨 애노테이션으로, 웹 애플리케이션과 관련된 파일이나 빈 모두 접근할 수 있다.
'JAVA > Spring Boot' 카테고리의 다른 글
Spring Data JPA (0) | 2018.04.02 |
---|---|
스프링 부트 데이터 액세스 (0) | 2018.02.12 |
스프링부트에서 스프링 (0) | 2018.02.09 |
스프링과 스프링 부트 비교 (0) | 2018.02.08 |
스프링 부트 작동원리 (0) | 2018.02.06 |