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
- java.lang.OutOfMemoryError: espace de stack Java
- Quand utiliser des acteurs au lieu de solutions de messagerie telles que WebSphere MQ ou Tibco Rendezvous?
- Filtrer les valeurs uniquement si non nul en utilisant lambda dans Java8
- Junit – exécuter la méthode de configuration une fois
- Quel est le moyen le plus simple d’parsingr un fichier INI en Java?
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.
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,
@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 . @DataJpaTest
, veuillez lire cette entrée officielle de Spring.io sur ce sujet (un peu fastidieux). 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 .