web-dev-qa-db-fra.com

Erreur: Impossible de trouver @SpringBootConfiguration lors de l'exécution de @WebMvcTest pour Spring Controller

Je teste mon contrôleur donné ci-dessous

@Controller
public class MasterController {

@GetMapping("/")
public String goLoginPage(){
    return "index";
}
}

Je suis en train de suivre this Spring pour tester mon contrôleur . Je souhaite maintenant tester mon contrôleur en instanciant simplement la couche Web et non le contexte Spring dans son intégralité, comme indiqué dans la documentation. Ci-dessous, mon code pour le même.

@RunWith(SpringRunner.class)
@WebMvcTest
public class MasterControllerTestWithWebLayer {

@Autowired
MockMvc mockMvc;

@Autowired
MasterController masterController;


@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testLoginHome() throws Exception{
    mockMvc.perform(get("/"))
    .andExpect(status().isOk())
    .andExpect(view().name("index"));
}

}

Lorsque j'exécute ce test, l'erreur Unable to find @SpringBootConfiguration,...etc s'affiche. Mais je ne comprends pas pourquoi il demande la configuration de Spring alors que nous ne voulons pas l’instancier mais que nous voulons utiliser uniquement la couche Web. Veuillez m'indiquer dans la bonne direction ce qui se passe ici. Et aussi comment résoudre ce problème. Merci

17
Meena Chaudhary

Alors voici la solution:

La documentation sur la détection de la configuration de test dit:

L'algorithme de recherche fonctionne à partir du package contenant le test jusqu'à ce qu'il trouve une classe annotée @SpringBootApplication ou @SpringBootConfiguration. Tant que vous avez structuré votre code de manière judicieuse, votre configuration principale est généralement trouvée.

Donc, la classe @SpringBootApplication devrait être plus élevée dans la hiérarchie du paquet que la classe de test, par exemple si la classe de test est dans le paquet com.zerosolutions.controller, alors la classe @SpringBootApplication devrait être dans un paquet supérieur à com.zerosolutions.controller package i.e com.zerosolutions ou com.

Problème

Mais si la classe @SpringBootApplication est au même niveau que la classe test, elle ne pourra pas la trouver i.e com.zerosolutions.general. Dans ce cas, vous obtiendrez l'erreur suivante:

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

Solution

Si vous exécutez un test intégré, vous pouvez explicitement mentionner la classe @SpringBootApplication comme ceci

@RunWith(SpringRunner.class)
@SpringBootTest(classes={SpringBootApp.class})

Mais si vous souhaitez tester un contrôleur d'unité, vous n'avez pas besoin de lancer tout le contexte Spring. Vous pouvez plutôt remplacer @SpringBootTest par @WebMvcTest(MasterController.class). Cela instanciera uniquement la couche Web avec MasterController et non le contexte Spring dans son ensemble.

Problème

Mais le problème est que vous rencontrerez à nouveau l'erreur que nous avons rencontrée précédemment:

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

Et @WebMvtTest n'a pas d'attribut classes comme @SpringBootTest pour mentionner explicitement la classe @SpringBootApplication . Il y a donc deux solutions à cela.

Solution

First: déplacez votre classe d'application vers un package supérieur au package de classe de test i.e com.zerosolutions ou com

Second: Mentionnez explicitement votre classe @SpringBootApplication comme ci-dessous

@RunWith(SpringRunner.class)
@WebMvcTest(MasterController.class)
@ContextConfiguration(classes={SpringBootApp.class})

J'espère que cela efface la confusion de Spring Test Configuration. Merci 

49
Meena Chaudhary

Si votre classe Application.Java (dans src/main/Java) est située sous 

com.A.B

Votre classe de test ApplicationTest.Java (dans src/test/Java) doit être sous

com.A.B ou com.A.B.C ou com.A.B.C.D

Vous obtiendrez cette erreur si la classe de test est située sous les packages suivants

com.A ou com.A.C ou com.A.D

Au début du printemps LA RÈGLE GÉNÉRALE IS NOM DE L'EMBALLAGE DE LA CLASSE D'ESSAI NÉCESSAIRE DE COMMENCER AVEC LE NOM DE L'EMBALLAGE DU PACKAGE DE LA CLASSE Java QUI IS va être testé  

8
tadtab

J'ai eu la même erreur et j'ai constaté que lorsque j'ai généré le projet, mon pom.xml a montré mon identifiant groupId sous la forme com.example plutôt qu'avec mon domaine réel:
<groupId>com.example</groupId>
J'ai corrigé le pom.xml comme suit:
<groupId>com.mydomain</groupId>
Ensuite, j'ai changé la structure de fichier de:
src/test/Java/com/example à src/test/Java/com/mydomain
Enfin, je devais mettre à jour la déclaration du paquet dans mon
SampleProjectApplicationTest.Java
fichier pour correspondre à la structure de fichier correcte. Une fois que tout était en place, les tests ont bien fonctionné.

Je ne suis pas sûr de savoir comment je me suis retrouvé avec com.example où le reste de mon projet était correct, mais la solution était aussi simple que cela dans mon cas. 

Espérons que cela aide quelqu'un.

0
stock