Fehler: @SpringBootConfiguration kann nicht gefunden werden, wenn @WebMvcTest für Spring Controller ausgeführt wird
Lesezeit: 5 Minuten
Ich teste meinen unten angegebenen Controller
@Controller
public class MasterController {
@GetMapping("https://stackoverflow.com/")
public String goLoginPage(){
return "index";
}
}
Ich folge Dieser Spring-Dokumentation zum Testen meines Controllers. Jetzt möchte ich meinen Controller testen, indem ich nur die Webschicht und nicht den gesamten Spring-Kontext instanziiere, wie in der Dokumentation angegeben. Unten ist mein Code für dasselbe.
@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("https://stackoverflow.com/"))
.andExpect(status().isOk())
.andExpect(view().name("index"));
}
}
Wenn ich diesen Test durchführe, erhalte ich den Fehler Unable to find @SpringBootConfiguration,...etc. Aber ich bin verwirrt, warum nach einer Spring-Konfiguration gefragt wird, wenn wir nicht möchten, dass sie instanziiert wird, sondern nur die Webschicht verwenden möchten. Bitte weisen Sie mich in die richtige Richtung, was hier passiert. Und auch wie man das beheben kann. Vielen Dank
versuchen Sie es mit diesem @WebMvcTest (Controller = MasterController.class). Und entfernen Sie diesen @Autowired MasterController masterController;
– pvpkiran
20. April 2017 um 9:34 Uhr
@pvpkiran okay, das würde funktionieren, aber warum nicht so?
– Meena Chaudhary
20. April 2017 um 9:56 Uhr
Haben Sie andere Abhängigkeiten in Ihrem Controller. Zum Beispiel wie eine Service-Klasse oder so etwas?
– pvpkiran
20. April 2017 um 9:59 Uhr
@pvpkiran Nein, und raten Sie mal, selbst wenn ich den Controller-Namen eingebe @WebMvcTest es funktioniert trotzdem nicht?
– Meena Chaudhary
20. April 2017 um 10:13 Uhr
Versuchen Sie, @SpringBootTest(classes = YourSpringBootClassName.class) über die MasterControllerTestWithWebLayer-Klasse zu setzen
Der Suchalgorithmus beginnt mit dem Paket, das den Test enthält, bis er eine mit @SpringBootApplication oder @SpringBootConfiguration kommentierte Klasse findet. Solange Sie Ihren Code sinnvoll strukturiert haben, wird Ihre Hauptkonfiguration normalerweise gefunden.
Also die @SpringBootApplication Die Klasse sollte in der Pakethierarchie höher sein als die Testklasse, z. B. wenn die Testklasse im Paket enthalten ist com.zerosolutions.controller dann @SpringBootApplication Klasse sollte in einem Paket höher sein als com.zerosolutions.controller Paket dh com.zerosolutions oder com.
Problem
Aber falls die @SpringBootApplication Klasse ist auf der gleichen Ebene wie die Testklasse, sie kann sie also nicht finden com.zerosolutions.general. In diesem Fall erhalten Sie die folgende Fehlermeldung:
java.lang.IllegalStateException: @SpringBootConfiguration kann nicht gefunden werden, Sie müssen @ContextConfiguration oder @SpringBootTest(classes=…) mit Ihrem Test verwenden
Lösung
Wenn Sie einen integrierten Test ausführen, können Sie die explizit erwähnen @SpringBootApplication Klasse so
Wenn Sie jedoch Komponententests für einen Controller durchführen möchten, müssen Sie nicht den gesamten Spring-Kontext starten. Sie können eher ersetzen @SpringBootTest mit @WebMvcTest(MasterController.class). Dadurch wird nur der Web-Layer mit instanziiert MasterController und nicht der gesamte Frühlingskontext.
Problem
Aber das Problem ist, dass Sie wieder auf den Fehler stoßen werden, mit dem wir zuvor konfrontiert waren:
java.lang.IllegalStateException: @SpringBootConfiguration kann nicht gefunden werden, Sie müssen @ContextConfiguration oder @SpringBootTest(classes=…) mit Ihrem Test verwenden
Und @WebMvtTest hat kein classes Attribut wie @SpringBootTest ausdrücklich zu erwähnen @SpringBootApplication Klasse. Dafür gibt es also zwei Lösungen.
Lösung
Erste: Verschieben Sie Ihre Anwendungsklasse in ein Paket, das höher als die Testklasse ist, dh com.zerosolutions oder com Paket.
Zweite: Erwähnen Sie Ihre @SpringBootApplication Klasse explizit wie unten
Ich hoffe, das beseitigt die Verwirrung bei der Spring Test-Konfiguration. Vielen Dank
Ihre Antwort hat mir geholfen, das Problem herauszufinden, das ich Stunden damit verbracht hatte, es herauszufinden. Die Testklasse konnte die Hauptbootanwendungsklasse nicht finden, obwohl sie anscheinend unter demselben Paket, aber in Haupt- und Testordnern war. Sobald ich mit der Annotation @ SpringBootTest (classes = …) speziell auf die Hauptanwendungsklasse hingewiesen habe, funktionierten die Dinge.
– Kishore
17. November 2017 um 21:25 Uhr
Das hat mir geholfen. In meinem Fall war mein Test eine Kotlin-Klasse, die in einer Datei ohne solche abgelegt wurde package Erklärung. Es geschah aufgrund von Kopieren, Einfügen und Verschieben von Dingen. Das Kotlin-Plugin von Intellij hat mich nie vor einer falsch platzierten Klasse gewarnt.
– ygor
22. Februar 2019 um 17:13 Uhr
Die großartige Antwort, die genau auf das Ziel trifft, hat mir geholfen, das Problem und die Lösung zu verstehen!
– Akila
12. Juni 2019 um 2:23 Uhr
Perfekt erklärt!
– X-Mensch
13. Oktober 2019 um 15:30 Uhr
Tadele Ayelegn
Wenn sich Ihre Application.java-Klasse (in src/main/java) unter befindet
com.A.B
Ihre Testklasse ApplicationTest.java (in src/test/java) muss unter sein
com.A.B oder com.A.B.C oder com.A.B.C.D
Sie erhalten diesen Fehler, wenn sich die Testklasse unter den folgenden Paketen befindet
com.A oder com.A.C oder com.A.D
Im Spring Boot IST DIE ALLGEMEINE REGEL DER NAME DES TESTKLASSENPAKETS MUSS MIT DEM PAKETNAMEN DES JAVA-KLASSENPAKETS BEGINNEN, DAS GETESTET WERDEN WIRD
In meinem Projekt habe ich meine Application.class in src/main/java/com/company/example und meine Testklasse ApplicationTest.java in src/test/java/com/company/example . Die Testausführung (mvn test) löst immer noch IllegalStateException aus. Habe ich bei deiner Erklärung etwas falsch verstanden? Ich dachte, dass Spring Boot mit diesem Setup die Anwendungsklasse automatisch finden kann.
– Otrebor
5. November 2018 um 21:34 Uhr
Ja, die Spring Boot-Testklasse sollte sich im selben Paket wie die Hauptklasse befinden.
– Akash5288
9. Dezember 2018 um 19:14 Uhr
Aktie
Ich hatte den gleichen Fehler und stellte fest, dass meine pom.xml beim Generieren des Projekts meine Gruppen-ID als com.example und nicht mit meiner tatsächlichen Domäne anzeigte: <groupId>com.example</groupId>
Ich habe die pom.xml wie folgt korrigiert: <groupId>com.mydomain</groupId>
Als nächstes änderte ich die Dateistruktur von: src/test/java/com/example zu src/test/java/com/mydomain
Zuletzt musste ich die Paketdeklaration in meiner aktualisieren SampleProjectApplicationTest.java
Datei, um der richtigen Dateistruktur zu entsprechen. Sobald das alles an Ort und Stelle war, funktionierten die Tests gut.
Ich bin mir nicht sicher, wie ich zu com.example gekommen bin, wo der Rest meines Projekts korrekt war, aber die Lösung war in meinem Fall so einfach.
Hoffentlich hilft das jemandem.
Überprüfen Sie, ob src/test/java denselben Paketnamen wie das Hauptklassenpaket hat. src/test/java/com/example/abc ist dasselbe wie src/test/java/com/example/abc
Ersetzen Sie einfach den Namen des Testpakets durch den Namen des Hauptpakets der Anwendungsklasse.
Beispiel:- package com.kotlin.dealerMainApplication Dies ist der Name meines Haupt-App-Pakets, also werde ich denselben Namen in mein Testpaket einfügen
Das hat bei mir funktioniert!
14413600cookie-checkFehler: @SpringBootConfiguration kann nicht gefunden werden, wenn @WebMvcTest für Spring Controller ausgeführt wirdyes
versuchen Sie es mit diesem @WebMvcTest (Controller = MasterController.class). Und entfernen Sie diesen @Autowired MasterController masterController;
– pvpkiran
20. April 2017 um 9:34 Uhr
@pvpkiran okay, das würde funktionieren, aber warum nicht so?
– Meena Chaudhary
20. April 2017 um 9:56 Uhr
Haben Sie andere Abhängigkeiten in Ihrem Controller. Zum Beispiel wie eine Service-Klasse oder so etwas?
– pvpkiran
20. April 2017 um 9:59 Uhr
@pvpkiran Nein, und raten Sie mal, selbst wenn ich den Controller-Namen eingebe
@WebMvcTest
es funktioniert trotzdem nicht?– Meena Chaudhary
20. April 2017 um 10:13 Uhr
Versuchen Sie, @SpringBootTest(classes = YourSpringBootClassName.class) über die MasterControllerTestWithWebLayer-Klasse zu setzen
– Programmierer-Junge
20. April 2017 um 10:40 Uhr