JUnit x Spring
Spring 사용을 위한 설정
- pom.xml 수정 - spring-context 추가
<!-- pom.xml -->
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.2.12.RELEASE</spring.version>
</properties>
...
<!-- spring-context와 spring-test 의존성 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
...
- ApplicationConfig.java 추가
package org.edwith.webbe.calculatorcli;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages= {"org.edwith.webbe.calculatorcli"})
public class ApplicationConfig {
}
- CalculatorService.java 수정 - @Component 추가
package org.edwith.webbe.calculatorcli;
import org.springframework.stereotype.Component;
@Component
public class CalculatorService {
public int plus(int value1, int value2) {
return value1 + value2;
}
public int minus(int value1, int value2) {
return value1 - value2;
}
public int multiple(int value1, int value2) {
return value1 * value2;
}
public int divide(int value1, int value2) throws ArithmeticException {
return value1 / value2;
}
}
- Main.java 추가
package org.edwith.webbe.calculatorcli;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
// ApplicationConfig.class 설정파일을 읽어들이는 ApplicationContext객체를 생성
// 실행되면서 컴포넌트 스캔을 하고, 컴포넌트를 찾으면 인스턴스를 생성하여 ApplicationContext가 관리
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
// ApplicationContext가 관리하는 CalculatorService.class 타입의 객체를 요청
CalculatorService calculatorService = applicationContext.getBean(CalculatorService.class);
// ApplicationContext로부터 받은 객체를 이용하여 덧셈
System.out.println(calculatorService.plus(10, 50));
}
}
테스트 클래스를 Spring Bean 컨테이너를 사용하도록 수정
- 기존 테스트 클래스는 테스트할 객체를 @Before가 붙은 메서드에서 초기화 하였다. (JUnit 참고)
- 하지만 Spring Bean 컨테이너 사용할 때는 개발자가 직접 인스턴스를 생성하면 안된다.
- Spring Bean 컨테이너가 Bean을 생성하고 관리하도록 하고, 그 Bean을 테스트 해야한다.
- 이를 위해 Spring은 특별한 기능을 제공한다.
// CalculatorServiceTest.java
package org.edwith.webbe.calculatorcli;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/* @RunWith(SpringJUnit4ClassRunner.class)
* : JUnit이 테스트 코드를 실행할 때 Spring Bean 컨테이너가 내부적으로 생성되도록 한다.
*
* @ContextConfiguration(classes = {ApplicationConfig.class})
* : 내부적으로 생성된 Spring Bean 컨테이너가 사용할 설정파일을 지정할 때 사용한다.
*
* class 위의 두 어노테이션으로 인해 테스트 클래스 자체가 Bean 객체가 되어 Spring에서 관리하게 된다.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ApplicationConfig.class})
public class CalculatorServiceTest {
/* CalculatorServiceTest 클래스가 Bean으로 관리되면서,
* Spring Bean 컨테이너는 Bean들을 찾아 메모리에 올리고
* CalculatorService 필드에 객체를 주입할 수 있게 된다.(@Autowired)
*/
@Autowired
CalculatorService calculatorService;
// Spring Bean 컨테이너 사용할 때는 개발자가 직접 인스턴스를 생성하면 안된다.
// @Before
// public void init() {
// this.calculatorService = new CalculatorService();
// }
@Test
public void plus() throws Exception{
// given
int value1 = 10;
int value2 = 5;
// when
int result = calculatorService.plus(value1, value2);
// then
Assert.assertEquals(15, result); // 결과와 15가 같을 경우에만 성공
}
@Test
public void divide() throws Exception{
// given
int value1 = 10;
int value2 = 5;
// when
int result = calculatorService.divide(value1, value2);
// then
Assert.assertEquals(2, result); // 결과와 2가 같을 경우에만 성공
}
@Test
public void divideExceptionTest() throws Exception{
// given
int value1 = 10;
int value2 = 0;
try {
calculatorService.divide(value1, value2);
}catch(ArithmeticException ae) {
Assert.assertTrue(true); // 이 부분이 실행되었다면 성공
return; // 메서드를 더 이상 실행하지 않음
}
Assert.assertTrue(false); // 이 부분이 실행되면 무조건 실패
}
}
Author And Source
이 문제에 관하여(JUnit x Spring), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@oyeon/JUnit-x-Spring저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)