鉴于此条目application.properties:
application.properties
server.port=0
这导致Spring Boot选择一个随机可用端口,并使用spock测试Spring Boot Web应用程序,spock代码如何知道要命中哪个端口?
正常注射是这样的:
@Value("${local.server.port}") int port;
不适用于spock。
您可以使用以下代码找到端口:
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; } }