We will write a JUnit 5 test case for CRUD operations - Create, Read, Update and Delete.
YouTube Video
@DataJpaTest Annotation Overview
The Spring boot provides @DataJpaTest annotation. This annotation will disable full auto-configuration and instead apply only configuration relevant to JPA tests. By default, it will use an embedded, in-memory H2 database instead of the one declared in the configuration file, for faster test running time as compared to disk file database.1. Create Spring Boot Project
Use the below details in the Spring boot creation:
Project Name: spring-data-data-testing
Project Type: Maven
Choose dependencies: Spring Data JPA, H2 database, Lombok, Spring Boot Dev Tools
Package name: net.javaguides.springboot
2. Maven Dependencies
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3. Create JPA Entity
package net.javaguides.springboot;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import jakarta.persistence.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Column(name = "email", nullable = false)
private String email;
}
4. Create Spring Data JPA Repository
The next thing we’re gonna do is create a repository to access a User’s data from the database.
The JpaRepository interface defines methods for all the CRUD operations on the entity, and a default implementation of the JpaRepository called SimpleJpaRepository.
package net.javaguides.springboot;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
Optional<Employee> findByEmail(String email);
}
5. CRUD JUnit Tests for Spring Data JPA Repository
We need to specify the execution order because JUnit doesn’t run test methods in the order they appear in the code. So we need to use the @TestMethodOrder and @Order annotations to execute test cases in ascending order.
package net.javaguides.springboot;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.annotation.Rollback;
import javax.sql.DataSource;
import java.util.List;
import java.util.Optional;
@DataJpaTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class EmployeeRepositoryTests {
@Autowired
private EmployeeRepository employeeRepository;
// JUnit test for saveEmployee
@Test
@Order(1)
@Rollback(value = false)
public void saveEmployeeTest(){
Employee employee = Employee.builder()
.firstName("Ramesh")
.lastName("Fadatare")
.email("ramesh@gmail.com")
.build();
employeeRepository.save(employee);
Assertions.assertThat(employee.getId()).isGreaterThan(0);
}
@Test
@Order(2)
public void getEmployeeTest(){
Employee employee = employeeRepository.findById(1L).get();
Assertions.assertThat(employee.getId()).isEqualTo(1L);
}
@Test
@Order(3)
public void getListOfEmployeesTest(){
List<Employee> employees = employeeRepository.findAll();
Assertions.assertThat(employees.size()).isGreaterThan(0);
}
@Test
@Order(4)
@Rollback(value = false)
public void updateEmployeeTest(){
Employee employee = employeeRepository.findById(1L).get();
employee.setEmail("ram@gmail.com");
Employee employeeUpdated = employeeRepository.save(employee);
Assertions.assertThat(employeeUpdated.getEmail()).isEqualTo("ram@gmail.com");
}
@Test
@Order(5)
@Rollback(value = false)
public void deleteEmployeeTest(){
Employee employee = employeeRepository.findById(1L).get();
employeeRepository.delete(employee);
//employeeRepository.deleteById(1L);
Employee employee1 = null;
Optional<Employee> optionalEmployee = employeeRepository.findByEmail("ram@gmail.com");
if(optionalEmployee.isPresent()){
employee1 = optionalEmployee.get();
}
Assertions.assertThat(employee1).isNull();
}
}
JUnit test for saveEmployee:
// JUnit test for saveEmployee
@Test
@Order(1)
@Rollback(value = false)
public void saveEmployeeTest(){
Employee employee = Employee.builder()
.firstName("Ramesh")
.lastName("Fadatare")
.email("ramesh@gmail.com")
.build();
employeeRepository.save(employee);
Assertions.assertThat(employee.getId()).isGreaterThan(0);
}
JUnit test for getEmployee:
@Test
@Order(2)
public void getEmployeeTest(){
Employee employee = employeeRepository.findById(1L).get();
Assertions.assertThat(employee.getId()).isEqualTo(1L);
}
We have also used assertThat() method from AssertJ library for more readability than using JUnit’s assertion methods.
JUnit test for getListOfEmployees:
@Test
@Order(3)
public void getListOfEmployeesTest(){
List<Employee> employees = employeeRepository.findAll();
Assertions.assertThat(employees.size()).isGreaterThan(0);
}
We have also used assertThat() method from AssertJ library for more readability than using JUnit’s assertion methods.
JUnit test for updateEmployee:
@Test
@Order(4)
@Rollback(value = false)
public void updateEmployeeTest(){
Employee employee = employeeRepository.findById(1L).get();
employee.setEmail("ram@gmail.com");
Employee employeeUpdated = employeeRepository.save(employee);
Assertions.assertThat(employeeUpdated.getEmail()).isEqualTo("ram@gmail.com");
}
JUnit test for deleteEmployee:
@Test
@Order(5)
@Rollback(value = false)
public void deleteEmployeeTest(){
Employee employee = employeeRepository.findById(1L).get();
employeeRepository.delete(employee);
//employeeRepository.deleteById(1L);
Employee employee1 = null;
Optional<Employee> optionalEmployee = employeeRepository.findByEmail("ram@gmail.com");
if(optionalEmployee.isPresent()){
employee1 = optionalEmployee.get();
}
Assertions.assertThat(employee1).isNull();
}
sir, please write test cases for controller layer for crud operations. please.
ReplyDelete