小编典典

使用属性server.port = 0运行spock测试时如何查找Spring Boot容器的端口

spring-boot

鉴于此条目application.properties

server.port=0

这导致Spring Boot选择一个随机可用端口,并使用spock测试Spring Boot Web应用程序,spock代码如何知道要命中哪个端口?

正常注射是这样的:

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

不适用于spock。


阅读 493

收藏
2020-05-30

共1个答案

小编典典

您可以使用以下代码找到端口:

int port = context.embeddedServletContainer.port

对于那些对java等效语言感兴趣的人:

int port = ((TomcatEmbeddedServletContainer)((AnnotationConfigEmbeddedWebApplicationContext)context).getEmbeddedServletContainer()).getPort();

这是一个可以扩展的抽象类,它包装了Spring Boot应用程序的初始化并确定了端口:

abstract class SpringBootSpecification extends Specification {

    @Shared
    @AutoCleanup
    ConfigurableApplicationContext context

    int port = context.embeddedServletContainer.port

    void launch(Class clazz) {
        Future future = Executors.newSingleThreadExecutor().submit(
                new Callable() {
                    @Override
                    public ConfigurableApplicationContext call() throws Exception {
                        return (ConfigurableApplicationContext) SpringApplication.run(clazz)
                    }
                })
        context = future.get(20, TimeUnit.SECONDS);
    }
}

您可以这样使用:

class MySpecification extends SpringBootSpecification {
    void setupSpec() {
        launch(MyLauncher.class)
    }

    String getBody(someParam) {
        ResponseEntity entity = new RestTemplate().getForEntity("http://localhost:${port}/somePath/${someParam}", String.class)
        return entity.body;
    }
}
2020-05-30