학습 테스트(Learning Test)

2024. 7. 8. 14:05토비의 스프링 6

- 직접 만들지 않은 코드, 라이브러리, 레거시 시스템에 대한 테스트

- 테스트 대상의 사용방법을 익히고 동작방식을 확인하는데 유용하다

- 외부 기술, 서비스가 버전이 올라갔을 때 이전과 동일하게 동작하는지 확인할 수도 있다.

 

 

1.

 

2.

 

3.

 

package tobyspring.hellospring.payment;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.math.BigDecimal;
import java.time.Clock;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

import static java.math.BigDecimal.valueOf;
import static org.assertj.core.api.Assertions.assertThat;

class PaymentServiceTest {

    Clock clock;
    @BeforeEach
    void beforeEach(){
        this.clock = Clock.fixed(Instant.now(),ZoneId.systemDefault());
    }

    @Test
    void convertedAmount() throws IOException {
        testAmount(valueOf(500),valueOf(5000),this.clock);
        testAmount(valueOf(1000),valueOf(10000),this.clock);
        testAmount(valueOf(3000),valueOf(30000),this.clock);
    }
    @Test
    void validUntil() throws IOException {
        PaymentService paymentService = new PaymentService(new ExRateProviderStub(valueOf(1_000)),clock);

        Payment payment = paymentService.prepare(1L, "USD", BigDecimal.TEN);

        //validUntil()이 prepare() 30분 뒤로 설정됐는가?
        LocalDateTime now = LocalDateTime.now(this.clock);
        LocalDateTime expectedValidUntil = now.plusMinutes(30);

        Assertions.assertThat(payment.getValidUntil()).isEqualTo(expectedValidUntil);


    }

    private static void testAmount(BigDecimal exRate, BigDecimal convertedAmount, Clock clock) throws IOException {
        PaymentService paymentService = new PaymentService(new ExRateProviderStub(exRate),clock);

        Payment payment = paymentService.prepare(1L, "USD", BigDecimal.TEN);//테스트에서 exception이 터지면 테스트가 실패함

        assertThat(payment.getExRate()).isEqualByComparingTo(exRate);//BigDecimal은 isEqualTo로 비교하면 위험할 수 있다.
        assertThat(payment.getConvertedAmount()).isEqualByComparingTo(convertedAmount);
    }

}

'토비의 스프링 6' 카테고리의 다른 글

변하는 코드 분리하기 - 메소드 추출  (0) 2024.07.10
도메인 오브젝트 테스트  (0) 2024.07.08
테스트와 DI  (0) 2024.07.08
테스트  (0) 2024.07.06
의존성 역전 원칙(Dependency Inversion Principle)  (0) 2024.07.04