SpringBoot 에서 JPA를 사용한 Repository 테스트 Testing JPA Repository in SpringBoot
- 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.ymlin 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
ymlwith 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 orderpackage 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);
}
댓글남기기