Impossible de trouver une configuration @SpringBoot lors d’un JpaTest

Je suis nouveau sur les frameworks (je viens juste de passer le cours) et c’est la première fois que j’utilise Springboot.

J’essaie de lancer un simple test de Junit pour voir si mes repositorys CrudReposit fonctionnent.

L’erreur que je continue à recevoir est la suivante:

Impossible de trouver une configuration @SpringBoot, vous devez utiliser @ContextConfiguration ou @SpringBootTest (classes = …) avec votre test java.lang.IllegalStateException

le démarrage du spring 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; Ssortingng 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(Ssortingng[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); } } 

Mon repository

 public interface AccountRepository extends CrudRepository { public Account findByUsername(Ssortingng username); } } 

Merci d’avance

En effet, Spring Boot se positionne 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 .

Je souhaite que vous ayez inclus les noms de paquet de toutes vos classes, ou du moins ceux pour Application et JpaTest . À propos de @DataJpaTest et de quelques autres annotations, ils recherchent une annotation @SpringBootConfiguration dans le package en cours 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 que le nom de votre application était com.example.Application , votre classe de test serait en mesure de trouver l’application @SpringBootApplication @SpringBootConfiguration ).

Si l’application se trouvait dans une twig différente de la hiérarchie du package, toutefois, comme com.example.application.Application , elle ne le trouverait pas.

Exemple

Considérons 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(Ssortingng[] 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 , puis mettez-y votre Application.java (et mettez à jour la déclaration de package dans le fichier), l’exécution du test vous donnera l’erreur suivante:

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

La configuration est attachée à la classe d’application, donc ce qui suit va tout configurer correctement:

 @SpringBootTest(classes = Application.class) 

Exemple du projet JHipster ici .

Cela vaut la peine de vérifier si vous avez annoté le nom du package refactoré de votre classe principale avec @SpringBootApplication . Dans ce cas, le testcase doit se trouver dans un package approprié, sinon il sera recherché dans l’ancien package. c’était le cas pour moi.

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

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

à l’annotation de test pour spécifier où elle doit chercher l’autre classe si vous ne voulez pas refactoriser votre hiérarchie de fichiers. C’est ce que suggère le message d’erreur en disant:

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

La tranche de test fournie dans Spring Boot 1.4 a apporté des fonctionnalités de test axées sur les fonctionnalités.

Par exemple,

@JsonTest fournit un environnement Jackson simple pour tester la sérialisation et la désérialisation de json.

@WebMvcTest fournit un environnement Web simulé, il peut spécifier la classe de contrôleur pour tester et injecter le MockMvc dans le test.

 @WebMvcTest(PostController.class) public class PostControllerMvcTest{ @Inject MockMvc mockMvc; } 

@DataJpaTest préparera une firebase database intégrée et fournira un environnement JPA de base pour le test.

@RestClientTest fournit l’environnement client REST pour le test, en particulier le RestTemplateBuilder, etc.

Ces annotations ne sont pas composées avec SpringBootTest, elles sont combinées avec une série d’annotations AutoconfigureXXX et @TypeExcludesFilter .

Jetez un coup d’oeil à @DataJpaTest .

 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @BootstrapWith(SpringBootTestContextBootstrapper.class) @OverrideAutoConfiguration(enabled = false) @TypeExcludeFilters(DataJpaTypeExcludeFilter.class) @Transactional @AutoConfigureCache @AutoConfigureDataJpa @AutoConfigureTestDatabase @AutoConfigureTestEntityManager @ImportAutoConfiguration public @interface DataJpaTest {} 

Vous pouvez append votre annotation @AutoconfigureXXX pour remplacer la configuration par défaut.

 @AutoConfigureTestDatabase(replace=NONE) @DataJpaTest public class TestClass{ } 

Regardons votre problème,

  1. Ne mélangez pas @DataJpaTest et @SpringBootTest , comme indiqué ci-dessus @DataJpaTest va construire la configuration à sa manière (par exemple, par défaut, il essaiera de préparer un H2 embarqué) à partir de l’inheritance de configuration de l’application. @DataJpaTest est désigné pour la tranche de test .
  2. Si vous souhaitez personnaliser la configuration de @DataJpaTest , veuillez lire cette entrée officielle de Spring.io sur ce sujet (un peu fastidieux).
  3. Divisez les configurations dans Application en configurations plus petites par des fonctionnalités telles que WebConfig , DataJpaConfig etc. Une configuration complète (Web, données, sécurité, etc.) a également provoqué l’échec de vos tests basés sur des tranches de test . Vérifiez les échantillons de test dans mon échantillon .