[JAVA] Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest

Qu'est-ce que @DataJpaTest?

Annotation pour l'utilisation de la configuration automatique pour tester les entités et les référentiels. Vous pouvez facilement écrire un test en utilisant ceci. Il présente les caractéristiques suivantes. -Chargez la classe avec @Entitiy et @Repository dans ApplicationContext. Les classes avec d'autres @Service etc. ne sont pas chargées. -Roll back la transaction pour chaque test (@Test). Le contrôle des transactions peut être modifié. -Utiliser la base de données en mémoire dans le test

De plus, TestEntityManager est préparé pour manipuler les données de test dans la classe de test.

Voir le document officiel pour plus de détails. 43.3.11 Auto-configured Data JPA Tests

Exemple

Ajoutez une dépendance à build.gradle pour utiliser la base de données H2 lors des tests avec JPA.

build.gradle


dependencies {

・ ・ ・
	compile('org.springframework.boot:spring-boot-starter-data-jpa')
	testCompile('org.springframework.boot:spring-boot-starter-test')
	testCompile group: 'com.h2database', name: 'h2', version: '1.4.197'
}

À titre d'exemple, créez une entité et un référentiel qui gèrent les informations du livre comme indiqué ci-dessous. L'exemple suivant est écrit en Kotlin, mais la méthode de description est la même en Java.

@Entity
@Table(name = "book")
data class Book(

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY) //L'ID est généré automatiquement
        @Column(name = "id")
        var id: Long = 0,

        @Column(name = "title")
        var title: String = "",

        @Column(name = "author")
        var author: String = "",

        @Column
        var price: Long = 0
)

Créez le référentiel suivant pour l'entité ci-dessus.

@Repository
interface BookRepository: JpaRepository<Book, Long> {

    //Une méthode qui renvoie une liste de livres avec l'auteur spécifié dans l'ordre croissant de prix
    fun findAllByAuthorOrderByPrice(author: String): List<Book>
}

Créez une classe de test. En utilisant TestEntityManager, les données de test peuvent être stockées dans la base de données sans utiliser le référentiel.

import org.assertj.core.api.Assertions.assertThat
import org.junit.Test
import org.junit.runner.RunWith
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.test.context.junit4.SpringRunner

@RunWith(SpringRunner::class)
@DataJpaTest
class BookRepositoryTest {

    @Autowired
    private lateinit var testEntityManager: TestEntityManager

    @Autowired
    private lateinit var bookRepository: BookRepository

    @Test
    fun test() {

        //Création de données de test
        testEntityManager.persist(Book(title = "title1", author = "author1", price = 102))
        testEntityManager.persist(Book(title = "title2", author = "author1", price = 101))
        testEntityManager.persist(Book(title = "title3", author = "author2", price = 104))
        testEntityManager.persist(Book(title = "title4", author = "author2", price = 103))

        val foundBooks = bookRepository.findAllByAuthorOrderByPrice("author1")

        //Il y a deux livres pour l'auteur1
        assertThat(foundBooks).size().isEqualTo(2)

        //Les résultats de la recherche sont classés par ordre croissant de prix, donc title2,Doit être dans l'ordre du titre1
        // title1
        assertThat(foundBooks[0].id).isEqualTo(2)
        assertThat(foundBooks[0].title).isEqualTo("title2")
        assertThat(foundBooks[0].author).isEqualTo("author1")
        assertThat(foundBooks[0].price).isEqualTo(101)

        // title2
        assertThat(foundBooks[1].id).isEqualTo(1)
        assertThat(foundBooks[1].title).isEqualTo("title1")
        assertThat(foundBooks[1].author).isEqualTo("author1")
        assertThat(foundBooks[1].price).isEqualTo(102)

    }
}

Recommended Posts

Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest
8 choses à insérer dans DB en utilisant Spring Boot et JPA
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Essayez d'utiliser Spring Boot Security
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Téléchargement et téléchargement de fichiers à l'aide d'Ajax avec Spring Boot (sans JQuery)
Fonction de profil Spring et application Spring Boot.
Image de l'application Spring Boot à l'aide de jib-maven-plugin et lancez-la avec Docker
Méthode d'implémentation pour source multi-données avec Spring boot (Mybatis et Spring Data JPA)
Redirection et test unitaire à l'aide de la lunette Spring Flash
Existe en utilisant la spécification dans Spring Data JPA
HTTPS avec Spring Boot et Let's Encrypt
Essayez d'utiliser Spring Boot avec VS Code
Traitement asynchrone avec Spring Boot en utilisant @Async
Ajoutez une botte de printemps et un dégradé à éclipse
À propos de la conception de Spring Boot et de l'environnement de test unitaire
Page d'erreur Spring Boot Whitelabel et réponse JSON
[FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot
Sortie des journaux de demande et de réponse avec Spring Boot
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
Divers tableau de correspondance de Spring Framework et Spring Boot
Référence mutuelle de l'entité de Spring Data JPA et ses notes
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
Spring Boot + Spring Data JPA À propos des jointures de table multiples
Politique de contre-mesure CSRF et exemple de mise en œuvre dans une application REST utilisant "Spring Boot" + "EXT JS"
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA