스프링 테스트(1) - JUnit 단위 테스트

2024. 2. 19. 23:09spring/TEST

스프링 테스트 컨텍스트 프레임워크에 구현된 스프링 테스트 지원 기능은 하부 테스트 프레임워크를 다음과 같은 개념으로 추상화한다.

 

- 테스트 컨텍스트

=> 애플리케이션 컨텍스트, 테스트 클래스를 비롯해 현재 테스트의 인스턴스, 메서드, 실행 등 테스트의 실행 컨텍스트를 캡슐화한다.

 

- 테스트 컨텍스트 관리자

=> 테스트 컨텍스트를 관리하는 주체다. 테스트 인스턴스를 준비하는 시점, 테스트 메서드 실행 이전, 테스트 메서드 실행 이후 등의 테스트 실행 시점에 미리 테스트 실행 리스너를 트리거한다.

 

- 테스트 실행 리스너

=> 리스너 인터페이스를 정의한다. 이 인터페이스를 구현하면 테스트 실행 이벤트를 리스닝할 수 있다. 테스트 컨텍스트 프레임워크는 자주 쓰는 테스트 기능에 맞춰 테스트 실행 리스너를 제공하지만 필요시 직접 작성 가능하다.

 

 

과제

자동화한 테스트를 작성해서 자바 애플리케이션이 제대로 작동하는지 반복적으로 검증하라

 

 

해결책

JUnit은 자바 플랫폼에서 가장 유명한 테스트 프레임워크이다.

 

 

풀이

은행 시스템을 개발한다. 시스템 품질을 보장하려면 구석구석 다 테스트해보아야 한다. 먼저, 다음과 같이 이자 계산기 인터페이스르 정의한다.

public interface InterestCalculator {
    void setRate(double rate);
    double calculate(double amount, double year);
}

 

 

이자 계산기마다 이율은 고정이다. 아주 단순한 계산 공식으로 이자 계산기를 구현한다.

public class SimpleInterestCalculator implements InterestCalculator{
    private double rate;
    @Override
    public void setRate(double rate) {
        this.rate = rate;
    }

    @Override
    public double calculate(double amount, double year) {
        if (amount < 0 || year < 0)
            throw new IllegalArgumentException("Amount or year must be positive");
        return amount * year * rate;
    }
}

 

 

JUnit 테스트 작성하기

테스트 케이스는 여느 pubilc 메서드 @Test를 붙인 메서드이다. 테스트 데이터는 @Before 메서드에 설정하고 테스트가 끝나면 @After 메서드에서 리소스를 해제한다.  모든 테스트 케이스 전후에 꼭 한버만 실행할 로직은 @BeforeClass/@AfterClass 를 붙인 public static 메서드에 구현한다.

 

class SimpleInterestCalculatorTest {

    private InterestCalculator interestCalculator;

    @BeforeEach //junit5 에서는 @Before 대신 @BeforeEach 사용
    public void init() {
        interestCalculator = new SimpleInterestCalculator();
        interestCalculator.setRate(0.05);
    }

    @Test
    void calculate() {
        double interest = interestCalculator.calculate(10000, 2);
        assertEquals(1000.0, interest, 0);
    }

    @Test
    void illegalCalculate() {
        assertThrows(IllegalArgumentException.class,
                () -> interestCalculator.calculate(-10000, 2));
    }

}