webentwicklung-frage-antwort-db.com.de

Der Spring-Boot-Test schlägt fehl: ServletWebServerApplicationContext kann nicht gestartet werden, da die ServletWebServerFactory-Bean fehlt

Testklasse: -

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { WebsocketSourceConfiguration.class,
        WebSocketSourceIntegrationTests.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {
                "websocket.path=/some_websocket_path", "websocket.allowedOrigins=*",
                "spring.cloud.stream.default-binder=kafka" })
public class WebSocketSourceIntegrationTests {

    private String port = "8080";

    @Test
    public void testWebSocketStreamSource() throws IOException, InterruptedException {
        StandardWebSocketClient webSocketClient = new StandardWebSocketClient();
        ClientWebSocketContainer clientWebSocketContainer = new ClientWebSocketContainer(webSocketClient,
                "ws://localhost:" + port + "/some_websocket_path");
        clientWebSocketContainer.start();
        WebSocketSession session = clientWebSocketContainer.getSession(null);
        session.sendMessage(new TextMessage("foo"));
        System.out.println("Done****************************************************");
    }

}

Ich habe dieselbe Ausgabe gesehen hier , aber nichts half mir. Kann ich wissen, was mir fehlt?

Ich habe spring-boot-starter-Tomcat als Kompilierzeitabhängigkeit in der Abhängigkeitshierarchie.

10
Krishas

Diese Meldung besagt: Sie müssen mindestens 1 ServletWebServerFactory-Bean im ApplicationContext konfigurieren, wenn Sie also bereits Spring-Boot-Starter-Tomcat haben , benötigen Sie um diese Bean entweder automatisch zu konfigurieren oder manuell zu konfigurieren .

Im Test gibt es also nur 2 Konfigurationsklassen, um den applicationContext zu laden. Diese sind = {WebsocketSourceConfiguration.class, WebSocketSourceIntegrationTests.class}. Dann sollte mindestens in einer dieser Klassen eine @ Bean-Methode vorhanden sein, die eine Instanz der gewünschten zurückgibt ServletWebServerFactory.

* LÖSUNG *

Stellen Sie sicher, dass Sie alle Beans in Ihrer Konfigurationsklasse laden

WebsocketSourceConfiguration {
  @Bean 
  ServletWebServerFactory servletWebServerFactory(){
  return new TomcatServletWebServerFactory();
  }
}

ODER aktivieren Sie auch die AutoConfiguration, um einen Klassenpfad-Scan und eine automatische Konfiguration dieser Beans durchzuführen.

@EnableAutoConfiguration
WebsocketSourceConfiguration

Kann auch in der Klasse Integrationstest durchgeführt werden.

@EnableAutoConfiguration
WebSocketSourceIntegrationTests

Weitere Informationen finden Sie in der Dokumentation zu SpringBootTest Anmerkungen https://docs.spring.io/spring-boot/docs/current/api/ org/springframework/boot/test/context/SpringBootTest.html

das liegt daran, dass spring die Eigenschaftendatei unter runtime nicht laden kann. Ich habe spring Profile verwendet und das Argument (program oder vm) unter runtime( Java -jar application.jar), das Hinzufügen des vm-Arguments von profile löste das Problem für mich.

Java -jar -Dspring.profiles.active=dev application.jar

oder mit Programmargument

Java -jar application.jar --spring.profiles.active=prod --spring.config.location=c:\config
0
Sanjay Nayak

in 2.0.5.RELEASE Ich hatte ein ähnliches Problem, als ich folgendes hatte.

package radon;
..
@SpringBootApplication
public class Initializer {
    public static void main(String[] args) {
        SpringApplication.run(Config.class, args);
    }
}

package radon.app.config;
@Configuration
@ComponentScan({ "radon.app" })
public class Config {
    ..
}

Das Ändern des Initializer-Pakets von radon in radon.app hat das Problem behoben.

0
Anand Rockzz