스프링 빈 컨테이너를 사용한 테스트 클래스

Minkyeong Kim·2021년 11월 22일
0

[boostcourse] Web-Backend

목록 보기
28/55

1) pom.xml 파일에 의존성 추가

     <!-- 기존 pom 파일에 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>
  </dependencies>

수정 후에는 프로젝트 우클릭 -> Maven -> Update Projects 해주기

2) ApplicationConfig 클래스 생성

xml파일 또는 Java Config로 설정 파일을 작성해야 스프링 프레임워크를 사용할 수 있음
-> Java Config 클래스를 src/main/java에 생성

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 {
}

3) Bean으로 등록할 클래스 파일에 어노테이션 추가

CalculatorService.java

package org.edwith.webbe.calculatorcli;

import org.springframework.stereotype.Component;

@Component // 스프링 빈 컨테이너가 이 클래스를 찾아 빈으로 등록할 수 있도록 함
public class CalculatorService {
	public int plus(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1 - v2;
	}
	public int multiple(int v1, int v2) {
		return v1*v2;
	}
	public int divide(int v1, int v2) {
		return v1/v2;
	}
}
  • 스프링 빈 컨테이너에서 관리하기 위해 어노테이션을 추가한다
  • 개발자는 직접 인스턴스를 생성하지 않고, 스프링 빈 컨테이너가 인스턴스를 생성해 관리한다

4) Main 클래스 생성

CalculatorService 클래스를 빈으로 받아와 사용하기 위해 src/main/java경로에 메인 클래스를 생성한다.

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 = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		
		//ApplicationContext가 관리하는 CalculatorService.class 타입의 객체 요청
		CalculatorService calculatorService = applicationContext.getBean(CalculatorService.class);
		
		// ApplicationContext로부터 받은 객체를 이용해 덧셈 함수 실행
		System.out.println(calculatorService.plus(10, 50));
	}

}

5) 테스트 클래스에 어노테이션 추가✨

CalculatorServiceTest.java

package org.edwith.webbe.calculatorcli;

import org.junit.Assert;
import org.junit.Before;
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) // @RunWith: Junit이 제공하는 어노테이션
// SpringJUnit4ClassRunner.class: JUnit의 확장 기능을 사용할 수 있도록 스프링에서 제공함
// 목적: 테스트코드를 실행 시 스프링 빈 컨테이너가 내부적으로 생성되도록 함

@ContextConfiguration(classes= {ApplicationConfig.class})
// 스프링 빈 컨테이너가 사용할 설정 파일 지정

//앞선 두 줄의 어노테이션을 작성하면 테스트클래스 자체가 Bean 객체가 되어 스프링에서 관리됨
public class CalculatorServiceTest {
	@Autowired //CalculatorService를 스프링 빈 컨테이너로부터 주입받음
	CalculatorService calculatorService;
	
	// 스프링 빈 컨테이너를 사용할 때는 개발자가 직접 인스턴스 생성 불가!
//	@Before
//	public void init() {
//		this.calculatorService=new CalculatorService();
//	}
	@Test
	public void plus() throws Exception{
		//given
		int v1= 10;
		int v2=5;
		
		//when
		int result = calculatorService.plus(v1, v2);
		
		//then
		Assert.assertEquals(15, result);
	}
	
	@Test
	public void divide() throws Exception{
		//given
		int v1=10;
		int v2=5;
		
		//when
		int result = calculatorService.divide(v1, v2);
		
		//then
		Assert.assertEquals(2, result);
	}
	
	@Test
	public void divideExceptionTest() throws Exception{
		int v1 = 10;
		int v2= 0;
		
		try {
			calculatorService.divide(v1, v2);
		}catch(ArithmeticException ae) {
			Assert.assertTrue(true);
		}
		
		Assert.assertFalse(false);
	}
}

0개의 댓글