web-dev-qa-db-ja.com

ServletWebServerFactory Beanが見つからないため、ServletWebServerApplicationContextを開始できませんというスプリングブートテストが失敗します

テストクラス:-

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

}

私は同じ問題を見ました here しかし、何も私を助けませんでした。何が欠けているのか知っていますか?

依存関係階層にコンパイル時の依存関係としてspring-boot-starter-Tomcatがあります。

19
Krishas

このメッセージは次のとおりです:ApplicationContextで少なくとも1つのServletWebServerFactory Beanを構成する必要があるため、すでにspring-boot-starter-Tomcat y -ouそのBeanを自動構成するか、手動で実行します

そのため、テストではapplicationContextをロードする構成クラスは2つのみで、これらは= {WebsocketSourceConfiguration.class、WebSocketSourceIntegrationTests.class}であり、これらのクラスの少なくとも1つに、目的のインスタンスを返す@Beanメソッドが必要です。 ServletWebServerFactory。

*ソリューション*

構成クラス内のすべてのBeanを必ずロードしてください

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

または、AutoConfigurationがそれらのBeanのクラスパススキャンおよび自動設定を実行できるようにします。

@EnableAutoConfiguration
WebsocketSourceConfiguration

Integration Testクラスでも実行できます。

@EnableAutoConfiguration
WebSocketSourceIntegrationTests

詳細については、SpringBootTest注釈ドキュメントを確認してください https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/context/SpringBootTest .html

in 2.0.5.RELEASE私は以下を持っていたときに同様の問題に直面しました。

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 {
    ..
}

Initializerのパッケージをradonからradon.appに変更すると、問題が修正されました。

1
Anand Rockzz

これは、springruntimeでプロパティファイルをロードできず、springプロファイルを使用しており、runtime( Java -jar application.jar)で(programまたはvm)引数を提供していなかったためです。 、プロファイルのvm引数を追加すると、問題が解決しました。

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

またはプログラム引数を使用して

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