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

    – Programmierer-Junge

    20. April 2017 um 10:40 Uhr


Benutzeravatar von Meena Chaudhary
Meena Chaudhary

Hier also die Lösung:

Die Dokumentation zum Erkennen von Testkonfigurationen sagt:

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

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

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

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

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

Benutzeravatar von Tadele Ayelegn
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

Benutzeravatar von stock
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!

1441360cookie-checkFehler: @SpringBootConfiguration kann nicht gefunden werden, wenn @WebMvcTest für Spring Controller ausgeführt wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy