5
votes

Spring Boot 2.1.1: java.lang.IllegalStateException: Impossible de récupérer l'erreur des packages de base @EnableAutoConfiguration lors de l'exécution du test unitaire

L'erreur suivante sera générée lorsque j'exécuterai mon test unitaire. Merci de bien vouloir indiquer si j'ai manqué quelque chose. J'utilise Spring Boot 2.1.1.RELEASE. Merci!

java.lang.IllegalStateException: impossible de récupérer Paquets de base @EnableAutoConfiguration


application-test.yml

└───src
    ├───main
    │   ├───java
    │   │   └───com
    │   │       └───abc
    │   │           └───app
    │   │               ├───config
    │   │               ├───data
    │   │               │   ├───model
    │   │               │   └───repository
    │   │               ├───exception
    │   │               ├───service
    │   │               └───serviceImpl
    │   └───resources
    │       ├───META-INF
    │       └───static
    │           ├───css
    │           ├───images
    │           └───js
    └───test
        └───java
            └───com
                └───abc
                    └───app
                        ├───data
                        │   └───repository
                        ├───service
                        └───serviceImpl

AppRepositoryTest.java

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {AppRepository.class})
@EnableConfigurationProperties
@DataJpaTest
@ActiveProfiles("test")
public class AppRepositoryTest {

    @Autowired
    AppRepository appRepository;

    @Before
    public void setUp() throws Exception {
        App app = new App();
        app.setAppId("testId");
        appRepository.save(app);
    }

    @Test
    public void testFindFirstByAppId() {
        assertNotNull(appRepository.findFirstByAppId("testId"));        
    }
}

Structure du package

@Repository
public interface AppRepository extends CrudRepository<App, Integer> {

    App findFirstByAppId(String appId);

}   

p>


4 commentaires

Pouvez-vous montrer la structure de votre package. Pourquoi avez-vous défini ContextConfiguration et EnableConfigurationProperties?


Ont modifié la question montrant le package. Merci. De mes tests, si je supprime EnableConfigurationProperties, le fichier de propriétés test.yml ne peut pas être lu. Si je supprime ContextConfiguration, j'obtiendrai une erreur "Impossible de trouver une SpringBootConfiguration".


le nom du test.yml doit être application-test.xml


Désolé, c'est déjà application-test.yml. J'aurais dû l'épeler en entier.


3 Réponses :


1
votes

Selon 45.3 Test des applications Spring Boot docs la méthode recommandée pour activer les fonctionnalités de Spring Boot (comme @EnableAutoConfiguration ) est d'utiliser @SpringBootTest au lieu de l'ancien @ContextConfiguration :

Spring Boot fournit une annotation @SpringBootTest , qui peut être utilisée comme alternative à l'annotation standard spring-test @ContextConfiguration lorsque vous avez besoin des fonctionnalités de Spring Boot. L'annotation fonctionne en créant le ApplicationContext utilisé dans vos tests via SpringApplication. En plus de @SpringBootTest , un certain nombre d'autres annotations sont également fournies pour tester des tranches plus spécifiques d'une application.

Vous pouvez essayer d'écrire des tests avec @ContextConfiguration , qui est une configuration partielle de Spring Boot, mais vous rencontrerez des problèmes similaires. Spring Boot est fortement basé sur des conventions, par exemple l'analyse des composants démarre à partir du package contenant la classe annotée @SpringBootApplication . Il n'est pas recommandé d'aller à l'encontre de ces conventions.


2 commentaires

Merci pour la réponse. J'ai essayé SpringBootTest, mais lorsque je l'utilise avec DataJpaTest, j'obtiens une erreur "java.lang.IllegalStateException: Erreur de configuration: plusieurs déclarations de BootstrapWith ont été trouvées" Avec SpringBoot 2.x, je n'ai pas eu cette erreur.


Ce n'est pas tout à fait vrai, car vous pouvez utiliser la technique de découpage des tests ( baeldung .com / spring-tests # 5-using-test-slices ). SpringBootTest chargera l'ensemble de l'application pour exécuter votre test. C'est la raison pour laquelle l'erreur informée par @Zaccus ci-dessus se produit. D'autres raisons de définir une ContextConfiguration dans vos tests sont d'utiliser un chargeur personnalisé, c'est-à-dire MockitoLoader ( github.com/desiderati/commons/blob/master/common-test/src/m‌ ain /… ).



3
votes

J'ai réussi à le faire fonctionner lorsque j'ai supprimé "ActiveProfiles" et "EnableConfigurationProperties" et que j'ai finalement spécifié la classe Main dans l'annotation ContextConfiguration:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {AppMain.class})
@DataJpaTest
public class AppRepositoryTest {

    @Autowired
    AppRepository appRepository;

    @Before
    public void setUp() throws Exception {
        App app = new App();
        app.setAppId("testId");
        appRepository.save(app);
    }

    @Test
    public void testFindFirstByAppId() {
        assertNotNull(appRepository.findFirstByAppId("testId"));        
    }
}


0 commentaires

2
votes

J'ai essayé la solution de Zaccus, mais cela n'a pas fonctionné pour moi. J'utilise Spring Boot 2.3.2.RELEASE et JUnit 5. Pour ma situation, j'avais besoin de déplacer mon modèle et mon référentiel dans une bibliothèque séparée car ils devaient être partagés par ma webapp et un outil.

Voici ce que je au travail:

Test JPA Spring Boot sans main ou SpringApplication

package com.example.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.example.model.Place;

import java.util.Optional;

@Repository
public interface PlaceRepository extends CrudRepository<Place, Long> {
    Optional<Place> findByName(String name);
}

À partir de Spring Boot 2.1, lorsque vous utilisez @DataJpaTest, vous n'avez plus besoin de spécifier

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>jpa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>jar</packaging>

    <properties>
        <spring.boot.starter.version>2.3.2.RELEASE</spring.boot.starter.version>
        <h2.version>1.4.200</h2.version>
        <lombok.version>1.18.12</lombok.version>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring.boot.starter.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring.boot.starter.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${spring.boot.starter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>${h2.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
src
 + main
    + java
       + com.example
          + model
             + Place
          + repository
             + PlaceRepository
 + test
    + java
       + com.example
          + repository
             + PlaceRepository

Pour ma situation, basePackages = {"com.example. *"} n'était pas nécessaire puisque PlaceRepository et PlaceRepositoryTest sont dans le même paquet. Je l'ai seulement ajouté ici au cas où quelqu'un aurait des tests qui incluent des référentiels trouvés dans différents packages. Sans "basePackages", @EnableJpaRepositories analysera le package de la classe de configuration annotée pour les référentiels Spring Data par défaut.

Au départ, je n'avais que les annotations suivantes:

@EntityScan("com.example.model")


0 commentaires