Spring Boot Java & Kotlin Test Code (코틀린스럽게)

박준규·2023년 5월 1일
0

본 글은 김영한님의 스프링 핵심 원리 - 기본편을 본 이후에 작성되었습니다.

오늘은 공부를 하는 도중에 기록했으면 좋겠다고 생각한 것이 있어 글을 작성하게 되었습니다.

현재 김영한님의 스프링 핵심 원리 - 기본편에서 주문과 할인 도메인 실행과 테스트를 듣고 있습니다. 여기서 할인 청책 테스트 코드를 작성하는 부분에서 자바코드를 kotlin으로 바꾸면서 진행하고 있는데요.

여기서는 코틀린의 scope function을 통해 간단히 자바 Test Code를 코틀린 Test Code로 바꾸어볼게요.

이번 Test는 단순히 정률 할인 정책 Class가 잘 작동하고 있는지 알아보는 Test입니다.

Java Code

import hello.core.member.data.Grade;
import hello.core.member.data.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class RateDiscountPoilcyTest {

    RateDiscountPoilcy rateDiscountPoilcy = new RateDiscountPoilcy();

    @Test
    @DisplayName("VIP는 10% 할인이 적용되어야 한다.")
    void vip_o() {
        //given
        Member member = new Member(
                1L,
                "memberA",
                Grade.VIP
        );
        // when
        int discount = rateDiscountPoilcy.discount(member, 10000);

        // then
        Assertions.assertThat(discount).isEqualTo(1000);
    }


    @Test
    @DisplayName("VIP가 아니면, 할인이 적용되면 안 된다.")
    void vip_x() {
    	// Given
        Member member = new Member(
                1L,
                "memberA",
                Grade.BASIC
        );
        // When
        int discount = rateDiscountPoilcy.discount(member, 10000);

		// Then
        Assertions.assertThat(discount).isEqualTo(0);
    }
}

위 코드의 흐름은 정말 단순하고 이해하기 쉽죠.

  1. RateDiscountPoilcy를 주입해줍니다. (따라서 RateDiscountPoilcyTest Class는 RateDiscountPoilcy Class에 의존하고 있습니다.)

  2. Member 객체를 정의합니다.

  3. rateDiscountPoilcy에 member와 가격(price)를 던져줍니다.

  4. 반환 받은 dicount를 Assertions에 던져 실제 금액과 예상 금액이 맞는지 확인합니다.

그래서 VIP와 BASIC 2가지의 카테고리에 대한 테스트 함수 모두 같은 로직으로 흘러가고 있습니다.

그리고 아래는 제가 작성한 Kotlin Test Code 입니다.

Kotlin Code

import hello.corekotlin.member.data.Grade
import hello.corekotlin.member.data.Member
import org.assertj.core.api.Assertions
import org.junit.jupiter.api.Test

internal class RateDiscountPolicyTest {

    val rateDiscountPolicy = RateDiscountPolicy()

    @Test
    fun vip_o() {
        Member(
            1L,
            "memberA",
            Grade.VIP
        ).apply {
            Assertions
                .assertThat(rateDiscountPolicy.discount(this, 10000))
                .isEqualTo(1000)
        }
    }

    @Test
    fun vip_x() {
        Member(
            1L,
            "memberA",
            Grade.BASIC
        ).apply {
            Assertions
                .assertThat(rateDiscountPolicy.discount(this, 10000))
                .isEqualTo(0)
        }
    }
}

member 객체를 만들고 이를 apply로 바로 넘겨서 테스트를 진행!

profile
'개발'은 '예술'이고 '서비스'는 '작품'이다

0개의 댓글