3 분 소요


  • SpringBoot2
  • Spring Data JPA
  • H2
  • Gradle
  • JUnit

Environment Setup

  • I’m going to run tests related to h2 database using SpringBoot
  • Just setting up h2 in application.yml in SpringBoot immediately connects the database, making it convenient for testing purposes

SpringBoot Starter

  • You can run it with SpringBoot Starter or install related dependencies from the Maven Repository page
    • Run as Gradle project
    • SpringBoot JPA
    • H2 Database
    • JUnit
    • lombok
    • commons-lang3

SpringBoot application.yml

  • Originally it’s application.properties, but I prefer yml with its hierarchical structure so I changed it
  • application.yml

    spring:
      jpa:
        open-in-view: false
        generate-ddl: true
        show-sql: true
        hibernate:
          ddl-auto: update
        properties:
          hibernate:
            show_sql: true
            format_sql: true
    
      h2:
        console:
          enabled: true
    

Setting Up Structure

  • Since we’re not going to run various tests but only work with packages and classes related to Repository, we’ll create domain and repository

domain package

  • Implement the model to be stored in the database in the domain package
  • OrderModel.java

      package com.example.springbootjpatest.domain;
    
    
      import lombok.*;
      import org.hibernate.Hibernate;
    
      import javax.persistence.*;
      import java.util.Objects;
    
    
      @Setter
      @Getter
      @AllArgsConstructor
      @NoArgsConstructor
      @Builder
      @Entity
      @Data
      @Table(name = "orders")
      public class OrderModel {
    
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
    
          @Column(name = "order_code", nullable = false)
          private String orderCode;
    
          @Column(name = "order_username", nullable = false)
          private String orderUsername;
    
          @Column(name = "shop_name", nullable = false)
          private String shopName;
    
          @Override
          public boolean equals(Object o) {
              if (this == o) return true;
              if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
              OrderModel that = (OrderModel) o;
              return id != null && Objects.equals(id, that.id);
          }
    
          @Override
          public int hashCode() {
              return getClass().hashCode();
          }
      }
    

repository package

  • Create a repository object that serves data to the database using domain objects
  • At this point, since we’ll implement Repository using JPA, we extend JPA without additional configuration
  • OrderRepository.java

      package com.example.springbootjpatest.repository;
    
      import com.example.springbootjpatest.domain.OrderModel;
      import org.springframework.data.jpa.repository.JpaRepository;
    
      public interface OrderRepository extends JpaRepository<OrderModel, Long> {
    
      }
    

Writing Test Code

  • To test the Repository, add the repository package to Test and write the test class below
  • Use the @TestMethodOrder(value = MethodOrderer.OrderAnnotation.class) annotation to specify the test order

      package com.example.springbootjpatest.repository;
    
    
      import com.example.springbootjpatest.domain.OrderModel;
      import org.apache.commons.lang3.RandomStringUtils;
      import org.aspectj.weaver.ast.Or;
      import org.junit.jupiter.api.*;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
    
    
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Optional;
    
      import static org.assertj.core.api.Assertions.assertThat;
    
      @DataJpaTest
      @TestMethodOrder(value = MethodOrderer.OrderAnnotation.class)
      public class OrderRepositoryTests {
          // test elements
      }
    

Repository Test - Autowired

  • Use @Autowired to use our created repository object in the test class
  • Since there are many annotations and packages at the top/bottom, they are omitted
// annotations omitted
public class OrderRepositoryTests {
    @Autowired
    private OrderRepository orderRepository;

    private OrderModel orderModel;
}

Repository Test - Initialization

public class OrderRepositoryTests {
    // omitted

    @BeforeEach
    public void setUp() {
        String randomCode = RandomStringUtils.randomAlphanumeric(15);
        orderModel = OrderModel
                .builder()
                .orderCode(randomCode)
                .orderUsername("test_user")
                .shopName("test_shop")
                .build();
    }
}

Repository Test - Save

public class OrderRepositoryTests {
    // omitted

    @DisplayName("Order Save Test")
    @Test
    @Order(1)
    public void testSave() {
        System.out.println(">>> SetUp OrderModel: " + orderModel.toString());

        // given
        String randomCode = RandomStringUtils.randomAlphanumeric(15);
        orderModel = OrderModel
                .builder()
                .orderCode(randomCode)
                .orderUsername("test_user")
                .shopName("test_shop")
                .build();

        System.out.println(">>> Origin OrderModel: " + orderModel.toString());


        // when
        OrderModel savedOrderModel = orderRepository.save(orderModel);
        System.out.println(">>> Saved OrderModel: " + savedOrderModel);

        // then
        assertThat(savedOrderModel.getId()).isNotNull();
        assertThat(savedOrderModel.getOrderCode()).isEqualTo(randomCode);
        assertThat(savedOrderModel.getOrderUsername()).isEqualTo("test_user");
        assertThat(savedOrderModel.getShopName()).isEqualTo("test_shop");
        assertThat(savedOrderModel.getId()).isGreaterThan(0);

    }
}

Repository Test - Bulk Save

public class OrderRepositoryTests {
    // omitted
    @DisplayName("Order Bulk Save Test")
    @Test
    @Order(2)
    public void testBulkSave() {
        // given
        ArrayList<OrderModel> orderModelList = new ArrayList<OrderModel>();
        for (int i = 0; i < 100; i++) {
            String randomCode = RandomStringUtils.randomAlphanumeric(15);
            orderModel = OrderModel
                    .builder()
                    .orderCode(randomCode)
                    .orderUsername("test_user")
                    .shopName("test_shop")
                    .build();

            System.out.println(">>> Create OrderModel: " + orderModel.toString());
            orderModelList.add(orderModel);
        }

        orderRepository.saveAll(orderModelList);

        //when
        List<OrderModel> savedOrderModels = orderRepository.findAll();
        for (OrderModel orderModel : savedOrderModels) {
            System.out.println(">>> Saved #" + orderModel.getId() + " OrderModel: " + orderModel.toString());
        }

        //then
        for (OrderModel orderModel : savedOrderModels) {
            assertThat(orderModel.getId()).isNotNull();
            assertThat(orderModel.getOrderCode()).isNotNull();
            assertThat(orderModel.getOrderUsername()).isNotNull();
            assertThat(orderModel.getShopName()).isNotNull();
            assertThat(orderModel.getId()).isGreaterThan(0);
        }

    }
}

Repository Test - Read All

@DisplayName("Read All Order Information")
@Test
@Order(3)
public void testReadAll() {
    //given
    ArrayList<OrderModel> orderModelList = new ArrayList<OrderModel>();
    for (int i = 0; i < 100; i++) {
        String randomCode = RandomStringUtils.randomAlphanumeric(15);
        orderModel = OrderModel
                .builder()
                .orderCode(randomCode)
                .orderUsername("test_user")
                .shopName("test_shop")
                .build();

        System.out.println(">>> Create OrderModel: " + orderModel.toString());
        orderModelList.add(orderModel);
    }

    orderRepository.saveAll(orderModelList);

    //when
    List<OrderModel> orderModels = orderRepository.findAll();
    System.out.println("####### " + orderModels);
    //then
    assertThat(orderModels.size()).isGreaterThan(0);
    assertThat(orderModels).isNotNull();
}

Repository Test - Conditional Query

@DisplayName("Read Order Information by Order Id")
@Test
@Order(4)
public void testReadById() {

    //given
    int min = 0;
    int max = 0;


    ArrayList<OrderModel> orderModelList = new ArrayList<OrderModel>();
    for (int i = 0; i < 100; i++) {
        String randomCode = RandomStringUtils.randomAlphanumeric(15);
        orderModel = OrderModel
                .builder()
                .orderCode(randomCode)
                .orderUsername("test_user")
                .shopName("test_shop")
                .build();

        System.out.println(">>> Create OrderModel: " + orderModel.toString());
        orderModelList.add(orderModel);
    }
    orderRepository.saveAll(orderModelList);

    min = orderRepository.findAll().get(0).getId().intValue();
    max = orderRepository.findAll().get(99).getId().intValue();


    // when
    int callId = (int) Math.floor(Math.random() * (max - min + 1) + min);
    System.out.println(">>> Call Id: " + callId);
    Optional<OrderModel> orderModel = orderRepository.findById((long) callId);
    System.out.println(">>> Read OrderModel: " + orderModel.toString());

    // then
    assertThat(orderModel.get().getId()).isEqualTo((long) callId);
    assertThat(orderModel.get().getOrderCode()).isNotNull();
    assertThat(orderModel.get().getOrderUsername()).isNotNull();
    assertThat(orderModel.get().getShopName()).isNotNull();
    assertThat(orderModel.get().getId()).isGreaterThan(0);

}

댓글남기기