programing

Spring Boot Test 1.5에서 런타임 로컬 서버 포트를 설정할 수 없음

bestprogram 2023. 7. 26. 22:16

Spring Boot Test 1.5에서 런타임 로컬 서버 포트를 설정할 수 없음

애플리케이션에 Spring Boot 1.5를 사용하고 있습니다.통합 테스트에서 웹 서버의 런타임 포트 번호를 가져오려고 합니다(참고:이 경우 TestRestTemplate는 유용하지 않습니다.)제가 시도한 몇 가지 접근법이 있지만 어느 것도 효과가 없는 것 같습니다.다음은 저의 접근 방식입니다.

첫 번째 접근법

@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {

@LocalServerPort      
protected int port;

내 안에서src/main/resources/config/application.properties서버 포트를 다음과 같이 정의한 파일

server.port = 8081

하지만 이 코드에서는 오류가 발생합니다.

자리 표시자의 로컬을 확인할 수 없습니다.서버.값 "${local"의 port'입니다.server.port}"

두 번째 접근법

나는 변했다.

웹 환경 = 웹 환경.정의됨_좌현

로.

웹 환경 = 웹 환경.랜덤_좌현

그리고 내 안에서src/main/resources/config/application.properties정의한 파일

server.port = 0

이는 첫 번째 접근 방식과 동일한 오류를 발생시킵니다.

세 번째 접근법

세 번째 접근 방식으로 사용하려고 했습니다.

protected int port;

@Autowired
Environment environment

this.port = this.environment.getProperty("local.server.port");

이것이 반환됩니다.null가치

네 번째 접근법

마지막으로 사용하려고 했습니다.ApplicationEvents청취할 이벤트 수신기를 만들어 포트 번호를 확인합니다.EmbeddedServletContainerIntialize

@EventListener(EmbeddedServletContainerInitializedEvent.class)
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
this.port = event.getEmbeddedServletContainer().getPort();
}

public int getPort() {
return this.port;
} 

에 동일하게 추가됨TestConfig

이제, 제 시험 수업에서 저는 포트를 얻기 위해 이 수신기를 사용해 보았습니다.

@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.RANDOM_PORT)
public class RestServiceTest {

protected int port;

@Autowired
EmbeddedServletContainerIntializedEventListener embeddedServletcontainerPort;

this.port = this.embeddedServletcontainerPort.getPort();

이것이 반환됩니다.0또한 청취자 이벤트가 트리거되지 않는다는 것을 알게 되었습니다.

문서나 다른 게시물처럼 매우 간단하지만 왠지 저에게는 효과가 없습니다.도움을 주셔서 감사합니다.

테스트 웹 환경에 대해 임의 포트를 구성하는 것을 잊었을 수 있습니다.

이렇게 하면 효과가 있습니다.@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

여기서 Spring Boot 1.5.2로 방금 테스트가 성공적으로 실행되었습니다.

import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class RandomPortTests {

    @Value("${local.server.port}")
    protected int localPort;

    @Test
    public void getPort() {
        assertThat("Should get a random port greater than zero!", localPort, greaterThan(0));
    }

}

스프링 부트 1.4를 사용하는 애플리케이션에서 동일한 문제가 발생했고 이벤트가 발생한 것을 발견했습니다.EmbeddedServletContainerInitializedEvent약간 지연되었습니다. 즉, 내 빈이 초기화된 후에 트리거됩니다. 따라서 이 문제를 해결하려면 포트를 RestClient 빈처럼 사용해야 하는 빈에 게으른 주석을 사용해야 했고 작동했습니다.예:

@Bean
@Lazy(true)
public RESTClient restClient() {
   return new RESTClient(URL + port)
}

당신은 넣는 것을 잊었습니다.@RunWith(SpringRunner.class)당신의 학급 장식 위에.

자, 한번 해보세요.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {
     @LocalServerPort
     int randomServerPort;
     ...
}

저도 같은 문제가 있었습니다.이 종속성을 추가하면 문제가 해결되었습니다.

<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-spring -->
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-spring</artifactId>
    <version>6.2.2</version>
</dependency>

언급URL : https://stackoverflow.com/questions/43491893/unable-to-set-runtime-local-server-port-in-spring-boot-test-1-5