JUnit x Spring

oyeon·2021년 1월 15일
0
post-custom-banner

Spring 사용을 위한 설정

  1. 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>
...
  1. 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 {

}
  1. 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;
	 }
}
  1. 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);	// 이 부분이 실행되면 무조건 실패
	}
}
profile
Enjoy to study
post-custom-banner

0개의 댓글