È possibile trovare la porta utilizzando questo codice:
int port = context.embeddedServletContainer.port
Che per chi è interessato al java equivalente è:
int port = ((TomcatEmbeddedServletContainer)((AnnotationConfigEmbeddedWebApplicationContext)context).getEmbeddedServletContainer()).getPort();
Ecco una classe astratta che si può estende che avvolge questa inizializzazione dell'applicazione di avvio di primavera e determina la porta:
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);
}
}
che è possibile utilizzare in questo modo:
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;
}
}
@SpringApplicationConfiguration sembra funzionare utilizzando Spock 1.0. – gilad
La risposta di Andy avrebbe dovuto essere contrassegnata come la vera risposta. La sua soluzione per ottenere la porta # con la stringa @Value è molto più elegante. – Jacomoman
BTW, @ andy-wilkinson, spock-spring ora supporta '@ SpringBootTest' come una singola annotazione invece di dover combinare' @ ContextConfiguration', '@ WebAppConfiguration' e' @ IntegrationTests'. Quindi tutto ciò che dovete fare è: '@SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)' – Jacomoman