在application.properties
中输入此条目:
server.port=0
导致Spring Boot选择一个随机可用端口,并使用spock测试一个spring boot web应用程序,spock代码如何知道要命中哪个端口?
正常注射如下:
@Value("${local.server.port}")
int port;
不能使用spock。
答案 0 :(得分:12)
您可以使用以下代码找到该端口:
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;
}
}
答案 1 :(得分:8)
只要您正确配置了spec类并且在类路径上有spock-spring
,注入就可以与Spock一起使用。有一个limitation in Spock Spring,这意味着如果您使用@SpringApplicationConfiguration
,它将无法引导您的Boot应用程序。您需要使用@ContextConfiguration
并手动配置它。有关详细信息,请参阅this answer。
问题的第二部分是你不能为@Value
使用GString。你可以逃避$
,但使用单引号更容易:
@Value('${local.server.port}')
private int port;
将它们放在一起,你得到一个看起来像这样的规范:
@ContextConfiguration(loader = SpringApplicationContextLoader, classes = SampleSpockTestingApplication.class)
@WebAppConfiguration
@IntegrationTest("server.port=0")
class SampleSpockTestingApplicationSpec extends Specification {
@Value("\${local.server.port}")
private int port;
def "The index page has the expected body"() {
when: "the index page is accessed"
def response = new TestRestTemplate().getForEntity(
"http://localhost:$port", String.class);
then: "the response is OK and the body is welcome"
response.statusCode == HttpStatus.OK
response.body == 'welcome'
}
}
另请注意,使用@IntegrationTest("server.port=0")
来请求使用随机端口。在application.properties
中配置它是一个不错的选择。
答案 2 :(得分:0)
你也可以这样做:
@Autowired
private org.springframework.core.env.Environment springEnv;
...
springEnv.getProperty("server.port");