In this tutorial, we will learn how to use Spring boot provided @DataJpaTest annotation to test Repository layer components.
We use Spring boot starter test dependency to write JUnit tests for Repository layer components:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
Spring Boot provides the @DataJpaTest annotation to test the persistence layer components that will autoconfigure in-memory embedded database for testing purposes.
The @DataJpaTest annotation doesn’t load other Spring beans (@Components, @Controller, @Service, and annotated beans) into ApplicationContext. By default, it scans for @Entity classes and configures Spring Data JPA repositories annotated with @Repository annotation.
By default, tests annotated with @DataJpaTest are transactional and roll back at the end of each test.
Spring boot provided @DataJpaTest annotation is not only to test Spring Data JPA repositories but it also supports to test JPA-related components.
For example:
Create Spring Boot Application
Using spring initialize, create a Spring Boot project and add the following dependencies:
Generate the Spring boot project as a zip file, extract it, and import it into IntelliJ IDEA.
Make sure that you have the below dependencies added to your pom.xml file:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </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>
Next, let's create a Student JPA entity:
package net.javaguides.spirngboot.entity; import lombok.*; import jakarta.persistence.*; @Setter @Getter @Builder @AllArgsConstructor @NoArgsConstructor @Entity @Table(name = "students") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; private String email; }
Let's create StudentRepository which extends the JpaRepository interface:
package net.javaguides.spirngboot.repository; import net.javaguides.spirngboot.entity.Student; import org.springframework.data.jpa.repository.JpaRepository; public interface StudentRepository extends JpaRepository<Student, Long> { }
Let's create StudentRepositoryTests class and add the following content to it:
package net.javaguides.spirngboot.repository; import net.javaguides.spirngboot.AbstractContainerBaseTest; import net.javaguides.spirngboot.entity.Student; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import static org.junit.jupiter.api.Assertions.*; @DataJpaTest class StudentRepositoryTest { @Autowired private StudentRepository studentRepository; // JUnit for save student operation - BDD style @Test public void givenStudentObject_whenSave_thenReturnSavedStudent(){ // given - setup or precondition Student student = Student.builder().firstName("Ramesh") .lastName("fadatare").email("ramesh@gmail.com").build(); // when - action or the testing Student savedStudent = studentRepository.save(student); // then - very output Assertions.assertNotNull(savedStudent); Assertions.assertNotNull(savedStudent.getId()); } // JUnit for findById student operation - BDD style @Test public void givenStudentId_whenfindbyId_thenReturnSavedStudent(){ // given - setup or precondition Student student = Student.builder().firstName("Ramesh") .lastName("fadatare").email("ramesh@gmail.com").build(); Student savedStudent = studentRepository.save(student); // when - action or the testing Student studentDB = studentRepository.findById(student.getId()).get(); // then - very output Assertions.assertNotNull(studentDB); } }
Spring Boot provides the @DataJpaTest annotation to test the persistence layer components that will autoconfigure in-memory embedded database for testing purposes. In this example, we are using an H2 in-memory database for testing purposes.
In this tutorial, we have learned how to use Spring boot provided @DataJpaTest annotation to test Repository layer components.