스크린샷 2024-07-22 오후 11.54.00.png

스크린샷 2024-07-22 오후 11.56.20.png

스크린샷 2024-07-23 오전 12.01.56.png

1. 구성요소를 활용한 테스트

class PaymentServiceTest {

    @Test
    void convertedAmount() throws IOException {
        testAmount(BigDecimal.valueOf(500), BigDecimal.valueOf(5_000));
        testAmount(BigDecimal.valueOf(1000), BigDecimal.valueOf(10_000));
        testAmount(BigDecimal.valueOf(3000), BigDecimal.valueOf(30_000));
    }

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

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

        // then
        Assertions.assertThat(payment.getExRate()).isEqualByComparingTo(exRate);
        Assertions.assertThat(payment.getConvertedAmount()).isEqualByComparingTo(convertedAmount);
    }
}

public class ExRateProviderStub implements ExRateProvider {
    private BigDecimal exRate;

    public ExRateProviderStub(BigDecimal exRate) {
        this.exRate = exRate;
    }

    public BigDecimal getExRate() {
        return exRate;
    }

    public void setExRate(BigDecimal exRate) {
        this.exRate = exRate;
    }

    @Override
    public BigDecimal getExRate(String currency) throws IOException {
        return exRate;
    }
}

2. 수동 DI를 이용하는 테스트

1) 테스트용 협력자/의존 오브젝트를 테스트 대상에 직접 주입하고 테스트

public class PaymentServiceSpringTest {

    @Test
    void convertedAmount() throws IOException {
        // given
        BeanFactory beanFactory = new AnnotationConfigApplicationContext(TestObjectFactory.class);
        PaymentService paymentService = beanFactory.getBean(PaymentService.class);

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

        // then
        Assertions.assertThat(payment.getExRate()).isEqualByComparingTo(BigDecimal.valueOf(1_000));
        Assertions.assertThat(payment.getConvertedAmount()).isEqualByComparingTo(BigDecimal.valueOf(10_000));
    }
}

@Configuration
public class TestObjectFactory {
    @Bean
    public PaymentService paymentService() { return new PaymentService(exRateProvider()); }

    @Bean
    public ExRateProvider exRateProvider() { return new ExRateProviderStub(BigDecimal.valueOf(1_000)); }
}

2) 테스트용 협력자/의존 오브젝트를 스프링의 구성 정보를 이용해서 지정하고 컨테이너로부터 테스트 대상을 가져와서 테스트