복붙노트

[SPRING] Spring 부트 테스트가 실패합니다. ServletWebServerFactory 빈이 없어서 ServletWebServerApplicationContext를 시작할 수 없습니다.

SPRING

Spring 부트 테스트가 실패합니다. ServletWebServerFactory 빈이 없어서 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****************************************************");
    }

}

나는 여기에서도 같은 문제를 보았지만 아무것도 도움이되지 못했다. 내가 뭘 놓쳤는지 알 겠어?

종속성 계층 구조에서 컴파일 시간 종속성으로 spring-boot-starter-tomcat이 있습니다.

해결법

  1. ==============================

    1.이 메시지는 : ApplicationContext에 적어도 하나의 ServletWebServerFactory 빈을 설정해야합니다. 따라서 spring-boot-starter-tomcat이 이미있는 경우에는 해당 빈을 자동 구성하거나 수동으로 수행해야합니다.

    이 메시지는 : ApplicationContext에 적어도 하나의 ServletWebServerFactory 빈을 설정해야합니다. 따라서 spring-boot-starter-tomcat이 이미있는 경우에는 해당 빈을 자동 구성하거나 수동으로 수행해야합니다.

    따라서 테스트에는 applicationContext를로드하는 구성 클래스가 2 개뿐입니다.이 클래스는 = {WebsocketSourceConfiguration.class, WebSocketSourceIntegrationTests.class}입니다. 그런 다음 최소한 하나의 클래스에 원하는 인스턴스를 반환하는 @Bean 메서드가 있어야합니다. ServletWebServerFactory.

    * 해결책 *

    구성 클래스 내의 모든 bean을로드해야합니다.

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

    또는 자동 구성을 사용하여 해당 빈의 클래스 경로 검색 및 자동 구성을 수행 할 수도 있습니다.

    @EnableAutoConfiguration
    WebsocketSourceConfiguration
    

    통합 테스트 클래스에서도 수행 할 수 있습니다.

    @EnableAutoConfiguration
    WebSocketSourceIntegrationTests
    

    자세한 내용은 SpringBootTest 주석 문서를 확인하십시오. https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/context/SpringBootTest.html

  2. ==============================

    2.내가 다음과 같은 것을했을 때 나는 비슷한 문제에 직면했다.

    내가 다음과 같은 것을했을 때 나는 비슷한 문제에 직면했다.

    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로 변경하면 문제가 해결되었습니다.

  3. ==============================

    3.이것은 스프링이 런타임에 특성 파일을로드 할 수 없기 때문에 스프링 프로파일을 사용하고 런타임에 (프로그램 또는 VM) 인수를 제공하지 않았기 때문에 (Java -jar application.jar) 프로파일의 VM 인수를 추가하여 나를 위해 문제.

    이것은 스프링이 런타임에 특성 파일을로드 할 수 없기 때문에 스프링 프로파일을 사용하고 런타임에 (프로그램 또는 VM) 인수를 제공하지 않았기 때문에 (Java -jar application.jar) 프로파일의 VM 인수를 추가하여 나를 위해 문제.

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

    또는 프로그램 인수 사용

    java -jar application.jar --spring.profiles.active=prod --spring.config.location=c:\config
    
  4. from https://stackoverflow.com/questions/48264118/spring-boot-test-fails-saying-unable-to-start-servletwebserverapplicationcontex by cc-by-sa and MIT license