[SPRING #5] Unit Test


상태 검증 : 메소드가 수행된 후, 객체의 상태를 확인하여 올바르게 동작했는지를 확인하는 검증법입니다

행위 검증 : 메소드의 리턴 값으로 판단할 수 없는 경우 특정 동작을 수행하는지확인하는 검증법입니다

Spring의 JUnit 5 지원
https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html

단위 테스트 지원

  • Mock Objects 지원
  • General Testing Utilities
  • Spring MVC Testing Utilities

통합 테스트 지원
Spring TestContext 프레임워크
https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testcontext-framework

Hamcrest Unit Test

주의해야 할 점은 AssertThat은 (실제값, 기대값) 순서이다.

1. prices의 사이즈가 3인가
2. prices안에 모든 값이 1보다 큰가
3. 순서 상관 없이 3,4,2가 포함되어있는가
4. prices는 2를 가지고 있는가

@TestInstance(TestInstance.Lifecycle.PER_CLASS)

이거의 의미가 뭘까? 클래스 단위로 인스턴스를 만든다는 것!!

@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@ActiveProfiles("test")
class JdbcProductRepositoryTest {

    static EmbeddedMysql embeddedMysql;

    @BeforeAll
    static void setup() {
        var config = aMysqldConfig(v5_7_10)
                .withCharset(Charset.UTF8)
                .withPort(2215)
                .withUser("test", "test1234!")
                .withTimeZone("Asia/Seoul")
                .build();
        embeddedMysql = anEmbeddedMysql(config)
                .addSchema("test-order_mgmt", ScriptResolver.classPathScript("schema.sql"))
                .start();
    }

    @AfterAll
    static void cleanup() {
        embeddedMysql.stop();
    }

    @Autowired
    ProductRepository repository;

    private final Product newProduct = new Product(UUID.randomUUID(), "new-product", Category.COFFEE_BEAN_PACKAGE, 1000L);


    @Test
    @Order(1)
    @DisplayName("상품을 추가할 수 있다.")
    void testInsert() {
        repository.insert(newProduct);
        var all = repository.findAll();
        assertThat(all.isEmpty(), is(false));
    }


    @Test
    @Order(2)
    @DisplayName("상품을 이름으로 조회할 수 있다.")
    void testFindByName() {
        var product = repository.findByName(newProduct.getProductName());
        assertThat(product.isEmpty(), is(false));
    }

    @Test
    @Order(3)
    @DisplayName("상품을아이디로 조회할 수 있다.")
    void testFindById() {
        var product = repository.findById(newProduct.getProductId());
        assertThat(product.isEmpty(), is(false));
    }

    @Test
    @Order(4)
    @DisplayName("상품들을 카테고리로 조회할 수 있다.")
    void testFindByCategory() {
        var product = repository.findByCategory(Category.COFFEE_BEAN_PACKAGE);
        assertThat(product.isEmpty(), is(false));
    }



}

상품을 아이디로 조회할 수 있다의 테스트는 실패한다.
왜일까?

그것은 바로 메서드 마다 하기 때문이다.

new Product(UUID.randomUUID(), 
"new-product", Category.COFFEE_BEAN_PACKAGE, 1000L);

해결
(1) static으로 인스턴스 만들기

private static final Product newProduct = new 
Product(UUID.randomUUID(), "new-product", 
Category.COFFEE_BEAN_PACKAGE, 1000L);

(2) @TestInstance(TestInstance.Lifecycle.PER_CLASS)

좋은 웹페이지 즐겨찾기