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
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
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é
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 monSampleProjectApplicationTest.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.