๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Back-end ๋ฐ๋ธŒ์ฝ”์Šค/week 03 - 05 TIL (Spring)

[TIL] 221107 - SpringBoot Part2 : Spring Test ์‹œ์ž‘ํ•˜๊ธฐ

by young-ji 2022. 11. 8.

SpringBoot Part2 - Spring Test ์‹œ์ž‘ํ•˜๊ธฐ

 

1. ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŒ…

์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฒฐํ•จ์„ ์ฐพ๋Š” ๊ณผ์ •

https://martinfowler.com/bliki/TestPyramid.html

 

 

Testing Level

  • Unit tests
  • Integration tests
  • Component tests
  • End-to-end tests

 

 

2. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ

: ๋ณดํŽธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ class์— ํ•˜๋‚˜์˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

: ๊ณ ๋ฆฝํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•œ๋‹ค.

: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์„๋•Œ ๊ธฐ์กด ๊ธฐ๋Šฅ๋“ค์ด ๋‹จ์œ„ํ…Œ์ŠคํŠธ์— ์˜ํ•ด ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค) ์ž์ฒด๊ฐ€ ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

: Spring ํ™˜๊ฒฝ์—์„œ๋„ ์ œ๊ณต์ด ๋˜๋‚˜ ํ•˜๋‚˜์˜ class์˜ ๊ธฐ๋Šฅ์— ์ง‘์ค‘ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ ์ด์ ์€ ์—†๋‹ค.

→ Spring์€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์— ๋” ํฐ ๋„์›€์„ ์ค€๋‹ค.

SUT

: System Under Test, ํ…Œ์ŠคํŠธ ๋Œ€์ƒ

: ์ „์ฒด ์‹œ์Šคํ…œ์ด ์•„๋‹Œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ์ง€์นญํ•œ๋‹ค.

: ์‹œ์Šคํ…œ ํ˜น์€ class์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

 

์˜์กด๊ด€๊ณ„์— ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ ํ˜‘๋ ฅ๊ด€๊ณ„์ž๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ…Œ์ŠคํŠธ ๋”๋ธ”๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ฃผ์ž…ํ•œ๋‹ค

 

 

ํ…Œ์ŠคํŠธ ๋”๋ธ”

: ์‹ค์žฌ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์˜์กด ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„๋•Œ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฐ์ฒด

: Stub, Mock ๊ฐ์ฒด ๋“ฑ์ด ์žˆ๋‹ค.

 

 

3. ํ†ตํ•ฉํ…Œ์ŠคํŠธ

: ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ์˜์กด๊ด€๊ณ„์™€ ์—ฐ๋™์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

https://codeutopia.net/blog/2015/04/11/what-are-unit-testing-integration-testing-and-functional-testing/

 

 

4. JUnit

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ

  • ๋งค ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์‹œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์• ๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•ด์„œ ํ…Œ์ŠคํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋„๋ก ์ง€์›ํ•ด์ค๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ฅผ ์ œ๊ณตํ•ด์„œ ์ธํ…”๋ฆฌ์ œ์ด / ์ดํด๋ฆฝ์Šค / ๋ฉ”์ด๋ธ ๋“ฑ์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•˜ ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • assert๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํŒ๋ณ„ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. → assertEquals(์˜ˆ์ƒ ๊ฐ’, ์‹ค์ œ ๊ฐ’)
  • ๊ฒฐ๊ณผ๋Š” ์„ฑ๊ณต(๋…น์ƒ‰), ์‹คํŒจ(๋ถ‰์€์ƒ‰) ์ค‘ ํ•˜๋‚˜๋กœ ํ‘œ์‹œํ•ด์ค๋‹ˆ๋‹ค

 

JUnit 4 → ํ•˜๋‚˜์˜ jarํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋ฌ์œผ๋ฉด ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ ธ ์—ฐ๋™์ด ํž˜๋“ค์—ˆ๋‹ค.

JUnit 5 → ํ™•์ •์„ฑ์„ ์œ„ํ•ด 3๊ฐœ์˜ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค. Junit Platform, JUnit Jupitor, JUnit Vintage

 

 

Junit Platform : ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋Ÿฐ์นญํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜, ํ”Œ๋ ›ํผ์„ ์ œ๊ณต. ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ

JUnit Jupitor : ์‹ค์ œ ๊ตฌํ˜„์ฒด. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.

JUnit Vintage : ๊ธฐ์กด JUnit 4์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์คŒ.

 

5. JUnit ์‹ค์Šต

: ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋ง๊ฐ€ํŠธ๋ฆด ์ˆ˜ ์žˆ์„์ง€ ์ฝ”ํŠธ๋ฅผ ์งœ๊ธฐ

: ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋Š” return ๊ฐ’์ด ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

class FixedAmountVoucherTest { // FixedAmountVoucher -> SUT
    private static final Logger logger = LoggerFactory.getLogger(FixedAmountVoucherTest.class);
    @BeforeAll
    static void setup(){
        logger.info("@BeforeAll - ๋‹จ ํ•œ๋ฒˆ ์‹คํ–‰");
    }

    @BeforeEach
    void init(){
        logger.info("@BefeorEach - ๋งค ํ…Œ์ŠคํŠธ ๋งˆ๋‹ค ์‹คํ–‰");
    }

    @Test
    @DisplayName("๊ธฐ๋ณธ์ ์ธ assertEqual ํ…Œ์ŠคํŠธ ")
    @Disabled // ์ด ํ…Œ์ŠคํŠธ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
    void testAssertEqual(){ // ์–ด๋– ํ•œ ๊ฐ’๋„ return ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
        assertEquals("1","1");
    }

    @Test
    @DisplayName("์ฃผ์–ด์ง„ ๊ธˆ์•ก๋งŒํผ ํ• ์ธ์„ ํ•ด์•ผํ•œ๋‹ค.")
    void testDiscount() {
        var sut = new FixedAmountVoucher(UUID.randomUUID(),100);
        assertEquals(900, sut.discount(1000));
    }

    @Test
    @DisplayName("ํ• ์ธ๋œ ํผ์•ก์€ ๋งˆ์ด๋„ˆ์Šค๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค.")
    void testMinusDiscountAmount() {
        var sut = new FixedAmountVoucher(UUID.randomUUID(),1000);
        assertEquals(0, sut.discount(900));
    }

    @Test
    @DisplayName("ํ• ์ธ ๊ธˆ์•ก์€ ์Œ์ˆ˜๊ฐ€ ๋˜์„œ๋Š” ์•ˆ๋œ๋‹ค")
    void testWithMinus(){
        assertThrows(IllegalArgumentException.class,() ->new FixedAmountVoucher(UUID.randomUUID(),-100));
        // ๋ฐœ์ƒ๋  ์˜ˆ์™ธ class๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์˜ˆ์™ธ๊ฐ€ ์ž˜ ๋ฐœ์ƒํ•˜๋‚˜ ํ™•์ธ : ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจ
    }

    @Test
    @DisplayName("์œ ํšจํ•œ ํ• ์ธ ๊ธˆ์•ก์œผ๋กœ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.")
    void testVoucherCreation(){
        // ์—ฌ๋Ÿฌ ์ผ€์ด์Šค์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ๋ฒˆ์— ํ…Œ์ŠคํŠธ
        assertAll("FixedAmountVoucher creation",
                ()-> assertThrows(IllegalArgumentException.class,()-> new FixedAmountVoucher(UUID.randomUUID(),0)),
                ()-> assertThrows(IllegalArgumentException.class,()-> new FixedAmountVoucher(UUID.randomUUID(),-100)),
                ()-> assertThrows(IllegalArgumentException.class,()-> new FixedAmountVoucher(UUID.randomUUID(),10000000)));
    }

}

 

TTD ?

 

DDD ?

 

 

→ ์–ด๋–ค ๋ฐฉ์‹์„ ํ•˜๋˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ผญ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

 

 

hamcrest

: ๋”์šฑ ๋‹ค์–‘ํ•œ ๊ฒ€์ฆ ๋กœ์ง์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
import static org.junit.jupiter.api.Assertions.*;

public class HamcrestAssertionTests {

    @Test
    @DisplayName("์—ฌ๋Ÿฌ hamcrest matcher ํ…Œ์ŠคํŠธ")
    void hamcrestTest() {
        assertEquals(2, 1 + 1);
        assertThat(1 + 1, equalTo(2)); //MatcherAssert ๋ฉ”์†Œ๋“œ
        assertThat(1 + 1, is(2));
        assertThat(1 + 1, anyOf(is(2), is(3)));

        assertNotEquals(1,1+1);
        assertThat(1+1, not(equalTo(1)));
    }

    // list๋‚˜ collection์„ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•œ ํŽธ๋ฆฌ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
    @Test
    @DisplayName("์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ matcher ํ…Œ์ŠคํŠธ")
    void hamcrestListMatcherTest(){
        var prices = List.of(1,2,3);
        assertThat(prices, hasSize(3));
        assertThat(prices, everyItem(greaterThan(0)));
        assertThat(prices, containsInAnyOrder(1,2,3));
        assertThat(prices, hasItem(greaterThanOrEqualTo(2)));
    }
}

 

 

6. Mock Object

: ๋ชจ์˜ ๊ฐ์ฒด!

https://khalilstemmler.com/wiki/test-doubles/

 

stub → ๋ง๊ทธ๋Œ€๋กœ ๊ฐ€์งœ ๊ฐ์ฒด

mock → ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๋ฅผ ๋ช…์„ธ. ํ–‰์œ„์— ์ง‘์ค‘

 

๋ชฉ ๊ฐ์ฒด๋Š” ํ–‰์œ„๊ฒ€์ฆ์„ ์‚ฌ์šฉํ•˜๊ณ , stub๋ฅผ ํฌํ•จํ•œ ๋‹ค๋ฅธ ๋Œ€์—ญ๋“ค์„ ์ƒํƒœ ๊ฒ€์ฆ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ƒํƒœ ๊ฒ€์ฆ : ๋ฉ”์†Œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ ํ›„, ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒ€์ฆ๋ฒ•. stub์œผ๋กœ ํ™•์ธ

ํ–‰์œ„ ๊ฒ€์ฆ : ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ด ๊ฐ’์„ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒ€์ฆ๋ฒ•. ํŠน์ • ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

 

 

Mock Object ์ƒ์„ฑ์„ ๋„์™€์ฃผ๋Š” TestFramework

  • Mockito
  • JMock
  • EasyMock

 

 

7. ์œ ๋‹›ํ…Œ์ŠคํŠธ ์‹ค์Šต

import static org.junit.jupiter.api.Assertions.*;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.*;
class OrderServiceTest {

    class OrderRepositoryStub implements OrderRepository{

        @Override
        public Order insert(Order order) {
            return null;
        }
    }

    // ์ƒํƒœ์— ์ง‘์ค‘์„ ํ•œ ํ…Œ์ŠคํŠธ
    @Test
    @DisplayName("order๊ฐ€ ์ƒ์„ฑ๋˜์•ผ์•„ํ•œ๋‹ค. (stub)")
    void TestCreateOrder() {
        // Given - ์‚ฌ์šฉํ•  ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
        var voucherRepository = new MemoryVoucherRepository();
        var fixedAmountVoucher = new FixedAmountVoucher(UUID.randomUUID(),100);
        voucherRepository.insert(fixedAmountVoucher);
        var sut = new OrderService(new VoucherService(voucherRepository),new OrderRepositoryStub());

        // When
        var order = sut.createOrder(UUID.randomUUID(), List.of(new OrderItem(UUID.randomUUID(), 200, 1)),fixedAmountVoucher.getVoucherId());

        //Then
        assertThat(order.totalAmount(), is(100L));
        assertThat(order.getVoucher().isEmpty(), is(false));
        assertThat(order.getVoucher().get().getVoucherId(), is(fixedAmountVoucher.getVoucherId()));
        assertThat(order.getOrderStatus(), is(OrderStatus.ACCEPTED));

    }

    @Test
    @DisplayName("order๊ฐ€ ์ƒ์„ฑ๋˜์•ผ์•„ํ•œ๋‹ค. (mock)")
    void TestCreateOrderByMock() {
        // Given - ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋งŒ๋“ฌ
        var voucherServiceMock = mock(VoucherService.class);
        var orderRepositoryMock = mock(OrderRepository.class);
        var fixedAmountVoucher = new FixedAmountVoucher(UUID.randomUUID(),100);

        when(voucherServiceMock.getVoucher(fixedAmountVoucher.getVoucherId())).thenReturn(fixedAmountVoucher);// ํ•ด๋‹น๋ถ€๋ถ„๋งŒ ๋™์ž‘ํ•œ๋‹ค.
        var sut = new OrderService(voucherServiceMock,orderRepositoryMock);

        // When - order๋งŒ๋“ค๊ธฐ
        var order = sut.createOrder(UUID.randomUUID(), List.of(new OrderItem(UUID.randomUUID(), 200, 1)),
                fixedAmountVoucher.getVoucherId());

        // Then - order์— ๋Œ€ํ•œ ์ƒํƒœ๊ฒ€์‚ฌ, orderservice์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” mock๋“ค์ด ์–ด๋– ํ•œ ํ–‰๋™์„ ํ•˜๋Š”์ง€ ๊ฒ€์ฆ
        assertThat(order.totalAmount(), is(100L));
        assertThat(order.getVoucher().isEmpty(), is(false));

        var inOrder = inOrder(voucherServiceMock, orderRepositoryMock);//mock์— ๋Œ€ํ•œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ• ์ˆ˜์žˆ๋‹ค.
        // ํ–‰์œ„์— ๋Œ€ํ•œ assert๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋– ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฌ๋Š”์ง€ verify

        inOrder.verify(voucherServiceMock).getVoucher(fixedAmountVoucher.getVoucherId());
        inOrder.verify(orderRepositoryMock).insert(order);
        inOrder.verify(voucherServiceMock).useVoucher(fixedAmountVoucher);
    }
}

: mock์„ ํ†ตํ•ด ๋ณ„๋„์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€์•Š๊ณ  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

8. Spring Test

Spring์˜ JUnit ์ง€์›

https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html

 

 

  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ ์ง€์›

→ but ๋น„์ง€๋‹ˆ์Šค๋กœ์ง์€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

  • ํ†ตํ•ฉํ…Œ์ŠคํŠธ ์ง€์›

: ์„œ๋ฒ„๋ฅผ ๋„์šฐ์ง€์•Š๊ณ  spring container ๋‚ด์—์„œ ๊ฐ๊ฐ์˜ bean๋“ค๊ฐ„์˜ ์—ฐ๋™์„ ํ…Œ์ŠคํŠธ ํ• ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

Spring TestContext

: ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด์„œ applicationContext๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค.

: ์บ์‹œ๊ธฐ๋Šฅ์ด ์žˆ์–ด ๋™์ผํ•œ ๋‚ด์šฉ์˜ ์ปจํ…Œ์ด๋„ˆ๋ผ๋ฉด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๊ตฌ๋™ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

9. Spring Test ์‹ค์Šต

//@ExtendWith(SpringExtension.class) //test context์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฒŒ ํ•ด์คŒ
//@ContextConfiguration
@SpringJUnitConfig
@ActiveProfiles("local")
public class KdtSpringContextTest {

    @Configuration
    @ComponentScan
    static  class Config{

    }
    @Autowired
    ApplicationContext applicationContext;

    @Autowired
    OrderService orderService;

    @Autowired
    VoucherRepository voucherRepository;

    @Test
    @DisplayName("application context๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.")
    public void testApplicationContext(){
        assertThat(applicationContext, notNullValue());
    }

    @Test
    @DisplayName("VoucherRepository๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ์–ด์•ผํ•œ๋‹ค.")
    public void testVoucherRepository(){
        var been = applicationContext.getBean(VoucherRepository.class);
        assertThat(been, notNullValue());

    }

    @Test
    @DisplayName("OrderService๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ• ์ˆ˜์žˆ๋‹ค.")
    public void testOrderService(){

        // Given
        var fixedAmountVoucher = new FixedAmountVoucher(UUID.randomUUID(),100);
        voucherRepository.insert(fixedAmountVoucher);

        // When
        var order = orderService.createOrder(UUID.randomUUID(), List.of(new OrderItem(UUID.randomUUID(), 200, 1)),
                fixedAmountVoucher.getVoucherId());

        //Then
        assertThat(order.totalAmount(), is(100L));
        assertThat(order.getVoucher().isEmpty(), is(false));
        assertThat(order.getVoucher().get().getVoucherId(), is(fixedAmountVoucher.getVoucherId()));
        assertThat(order.getOrderStatus(), is(OrderStatus.ACCEPTED));

    }
}

 

 

 

 

์ถœ์ฒ˜ - ํ•ด๋ฆฌ : SpringBoot Part1

๋Œ“๊ธ€