wake-up-neo.com

Fehler: @SpringBootConfiguration kann nicht gefunden werden, wenn @WebMvcTest für Spring Controller ausgeführt wird

Ich teste meinen Controller unten

@Controller
public class MasterController {

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

Ich folge this Spring-Dokumentation, um meinen Controller zu testen ... Nun möchte ich meinen Controller testen, indem ich einfach die Web-Schicht instanziiere und nicht den gesamten Spring-Kontext, wie in der Dokumentation angegeben. Unten ist mein Code für das gleiche.

@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"));
}

}

Wenn ich diesen Test durchführe, erhalte ich die Fehlermeldung Unable to find @SpringBootConfiguration,...etc. Ich bin jedoch verwirrt, warum es nach einer Spring-Konfiguration fragt, wenn wir nicht möchten, dass die Instanz es instanziiert, sondern nur die Web-Ebene verwendet. Bitte weisen Sie mich in die richtige Richtung, was hier passiert. Und auch wie man das beheben kann. Vielen Dank

17
Meena Chaudhary

Also hier ist die Lösung:

Die Dokumentation zur Erkennung der Testkonfiguration sagt:

Der Suchalgorithmus funktioniert mit dem Paket, das den Test enthält, bis er eine annotierte Klasse @SpringBootApplication oder @SpringBootConfiguration findet. Solange Sie Ihren Code auf sinnvolle Weise strukturieren, wird Ihre Hauptkonfiguration normalerweise gefunden.

Die Klasse @SpringBootApplication sollte also in der Pakethierarchie höher sein als die Testklasse. Wenn sich die Testklasse im Paket com.zerosolutions.controller befindet, sollte die Klasse @SpringBootApplication in einem Paket enthalten sein, das höher ist als das Paket com.zerosolutions.controller, dh com.zerosolutions oder com.

Problem

Befindet sich die Klasse @SpringBootApplication jedoch auf derselben Stufe wie die Testklasse, kann sie nicht gefunden werden, d. H. com.zerosolutions.general. In diesem Fall erhalten Sie folgende Fehlermeldung:

Java.lang.IllegalStateException: @SpringBootConfiguration kann nicht gefunden werden. Sie müssen @ContextConfiguration oder @SpringBootTest (classes = ...) für Ihren Test verwenden

Lösung

Wenn Sie einen integrierten Test ausführen, können Sie die Klasse @SpringBootApplication explizit so erwähnen

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

Wenn Sie jedoch einen Unit-Test eines Controllers durchführen möchten, müssen Sie nicht den gesamten Spring-Kontext starten. Sie können @SpringBootTest lieber durch @WebMvcTest(MasterController.class) ersetzen. Dadurch wird nur die Webebene mit MasterController und nicht der gesamte Spring-Kontext instanziiert.

Problem

Aber das Problem ist, dass Sie wieder auf den Fehler stoßen werden, mit dem wir früher konfrontiert waren:

Java.lang.IllegalStateException: @SpringBootConfiguration kann nicht gefunden werden. Sie müssen @ContextConfiguration oder @SpringBootTest (classes = ...) für Ihren Test verwenden

Und @WebMvtTest verfügt nicht über ein classes-Attribut wie @SpringBootTest, um die @SpringBootApplication-Klasse explizit zu erwähnen. Es gibt also zwei Lösungen.

Lösung

First: Verschieben Sie Ihre Anwendungsklasse in ein Paket, das über der Testklasse liegt, d. H. com.zerosolutions oder com

Second: Erwähnen Sie Ihre @SpringBootApplication-Klasse explizit wie folgt

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

Hoffe, dass die Verwirrung bei der Spring Test-Konfiguration beseitigt wird. Vielen Dank 

49
Meena Chaudhary

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 diese Fehlermeldung, wenn sich die Testklasse unter den folgenden Paketen befindet

com.A oder com.A.C oder com.A.D

In Spring boot DIE ALLGEMEINE REGEL IS TEST CLASS PACKAGE NAME MUSS MIT DEM PACKAGE NAME DES Java CLASS PAKETS ANFANGEN, DAS IS GEPRÜFT WIRD  

8
tadtab

Ich hatte den gleichen Fehler und stellte fest, dass meine pom.xml bei der Generierung des Projekts meine groupId als com.example und nicht mit meiner tatsächlichen Domäne zeigte:
<groupId>com.example</groupId>
Ich habe die pom.xml so korrigiert, dass sie:
<groupId>com.mydomain</groupId>
Als nächstes änderte ich die Dateistruktur von:
src/test/Java/com/example bis src/test/Java/com/mydomain
Zuletzt musste ich die Paketdeklaration in meinem aktualisieren
SampleProjectApplicationTest.Java
-Datei, um der richtigen Dateistruktur zu entsprechen. Sobald alles fertig 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 in meinem Fall war der Fix so einfach. 

Hoffentlich hilft das jemandem.

0
stock