Open all-cloudz opened 4 months ago
강의 코드
package tobyspring.hellospring.payment;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import tobyspring.hellospring.exrate.WebApiExRateProvider;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static org.assertj.core.api.Assertions.assertThat;
class PaymentServiceTest {
@Test
@DisplayName("prepare 메서드가 요구사항 3가지를 잘 충족했는지 검증")
void prepare() throws IOException {
PaymentService paymentService = new PaymentService(new WebApiExRateProvider());
Payment payment = paymentService.prepare(1L, "USD", BigDecimal.TEN);
// 환율정보 가져온다
assertThat(payment.getExRate()).isNotNull();
// 원화환산금액 계산
assertThat(payment.getConvertedAmount())
.isEqualTo(payment.getExRate().multiply(payment.getForeignCurrencyAmount()));
//원화환산금액유효시간 계산
assertThat(payment.getValidUntil()).isAfter(LocalDateTime.now());
assertThat(payment.getValidUntil()).isBefore(LocalDateTime.now().plusMinutes(30));
}
}
제어할 수 없는 외부 시스템에 문제가 생기면?
ExRateProvider가 제공하는 환율 값으로 계산한 것인가?
환율 유효 시간 계산은 정확한 것인가?
테스트 대상 (SUT)
테스트
협력자
BigDecimal은 유효자리수도 따지기 때문에 isEqualByComparingTo
로 비교하는게 나음
@ContextConfiguration
, @Autowired
추가적으로 정리할 것
섹션3. 테스트
@Test
,@BeforeEach
,@ParamaterizedTest
,@DisplayName
@ExtendWith(SpringExtention.class)
@ContextConfiguration
: 테스트를 위해 어떤 컨텍스트를 사용할 것인지 지정 ⇒ 스프링 컨테이너에 로드@Autowired
: 스프링 컨테이너의 특정 빈을 바인딩