web-dev-qa-db-fra.com

Impossible de trouver une @SpringBootConfiguration lors de l'exécution d'un test JpaTest

Je suis nouveau dans les frameworks (je viens de passer la classe) et c'est la première fois que j'utilise Springboot.

J'essaie de lancer un simple test Junit pour voir si mes CrudRepositories fonctionnent réellement.

L'erreur que je continue à obtenir est la suivante:

Impossible de trouver @SpringBootConfiguration, vous devez utiliser @ContextConfiguration ou @SpringBootTest (classes = ...) avec votre test Java.lang.IllegalStateException

spring Boot ne se configure-t-il pas?

Ma classe de test

@RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class JpaTest {

@Autowired
private AccountRepository repository;

@After
public void clearDb(){
    repository.deleteAll();
}

 @Test
 public void createAccount(){
     long id = 12;
     Account u = new Account(id,"Tim Viz");
     repository.save(u);

     assertEquals(repository.findOne(id),u);

 }


 @Test
 public void findAccountByUsername(){
     long id = 12;
     String username = "Tim Viz";
     Account u = new Account(id,username);
     repository.save(u);

     assertEquals(repository.findByUsername(username),u);

 }

Mon démarreur d'application de démarrage Spring

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"domain.repositories"})
@ComponentScan(basePackages = {"controllers","domain"})
@EnableWebMvc
@PropertySources(value    {@PropertySource("classpath:application.properties")})
    @EntityScan(basePackages={"domain"})
    public class Application extends SpringBootServletInitializer {
        public static void main(String[] args) {
            ApplicationContext ctx = SpringApplication.run(Application.class, args);         

        }
    }

Mon dépôt

public interface AccountRepository extends CrudRepository<Account,Long> {

    public Account findByUsername(String username);

    }
}

merci d'avance

115
Thomas Billet

En effet, Spring Boot s’installe pour la plupart. Vous pouvez probablement déjà vous débarrasser d'une grande partie du code que vous avez posté, en particulier dans Application.

J'aurais aimé que vous ayez inclus les noms de paquetage de toutes vos classes, ou du moins ceux de Application et JpaTest. La chose à propos de @DataJpaTest et de quelques autres annotations est qu’ils recherchent une annotation @SpringBootConfiguration dans le package actuel et s’ils ne peuvent pas la trouver, ils traversent la hiérarchie du package jusqu’à ce qu’ils la trouvent.

Par exemple, si le nom complet de votre classe de test était com.example.test.JpaTest et celui de votre application, com.example.Application, votre classe de test pourrait alors trouver le @SpringBootApplication (et le @SpringBootConfiguration).

Si l'application résidait dans une autre branche de la hiérarchie du paquet, cependant, comme com.example.application.Application, elle le trouverait pas.

Exemple

Considérez le projet Maven suivant:

my-test-project
  +--pom.xml
  +--src
    +--main
      +--com
        +--example
          +--Application.Java
    +--test
      +--com
        +--example
          +--test
            +--JpaTest.Java

Et puis le contenu suivant dans Application.Java:

package com.example;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Suivi du contenu de JpaTest.Java:

package com.example.test;

@RunWith(SpringRunner.class)
@DataJpaTest
public class JpaTest {

    @Test
    public void testDummy() {
    }
}

Tout devrait fonctionner. Si vous créez un nouveau dossier dans src/main/com/example appelé app et que vous placez ensuite votre Application.Java dans celui-ci (et mettez à jour la déclaration package dans le fichier), l'exécution du test génère l'erreur suivante:

Java.lang.IllegalStateException: impossible de trouver un @SpringBootConfiguration, vous devez utiliser @ContextConfiguration ou @SpringBootTest (classes = ...) avec votre test

181
Thomas Kåsene

La configuration étant attachée à la classe d’application, les éléments suivants configureront tout correctement:

@SpringBootTest(classes = Application.class)

Exemple tiré du projet JHipster ici .

58
mrts

Il est intéressant de vérifier si vous avez refactored le nom du paquet de votre classe principale annoté avec @SpringBootApplication. Dans ce cas, le cas de test doit être dans un package approprié, sinon il le recherchera dans le package plus ancien. c'était le cas pour moi.

13
Mohammed Rafeeq

En plus de ce que Thomas Kåsene a dit, vous pouvez également ajouter

@SpringBootTest(classes=com.package.path.class)

à l'annotation test pour spécifier où il doit chercher l'autre classe si vous ne voulez pas refactoriser votre hiérarchie de fichiers Voici ce à quoi le message d'erreur fait allusion en disant:

Unable to find a @SpringBootConfiguration, you need to use 
@ContextConfiguration or @SpringBootTest(classes=...) ...
6
Cameron Gagnon

Ça marche pour moi

le nom du package de la classe de test ci-dessus est remplacé par le même nom que celui de la classe normale.

change to this

1
hang gao

Je pense que la meilleure solution à ce problème consiste à aligner la structure de vos dossiers de tests sur celle des dossiers de l'application.

J'ai eu le même problème causé par la duplication de mon projet à partir d'un projet de structure de dossiers différent.

si votre projet de test et votre projet d'application auront la même structure, vous ne serez pas obligé d'ajouter des annotations spéciales à vos classes de tests et tout fonctionnera tel quel.

0
silver

Dans mon cas, les packages étaient différents entre les classes Application et Test.

package com.example.abc;
...
@SpringBootApplication
public class ProducerApplication {

et

package com.example.abc_etc;
...
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerApplicationTest {

Après les avoir mis d'accord, les tests se déroulaient correctement.

0
Nick