Я ищу совета о том, как получить порт, который был назначен встроенному коту, который обслуживает конечную точку привода, при установке свойства management.port
на 0
в интеграционных тестах.
Я использую Spring Boot 1.3.2 со следующей конфигурацией application.yml
:
server.port: 8080
server.contextPath: /my-app-context-path
management.port: 8081
management.context-path: /manage
...
мои интеграционные тесты затем аннотируются @WebIntegrationTest
, а для показанных выше портов устанавливается значение 0
@WebIntegrationTest({ "server.port=0", "management.port=0" })
и следующий служебный класс следует использовать для получения доступа к конфигурации приложения при выполнении полных интеграционных тестов:
@Component
@Profile("testing")
class TestserverInfo {
@Value( '${server.contextPath:}' )
private String contextPath;
@Autowired
private EmbeddedWebApplicationContext server;
@Autowired
private ManagementServerProperties managementServerProperties
public String getBasePath() {
final int serverPort = server.embeddedServletContainer.port
return "http://localhost:${serverPort}${contextPath}"
}
public String getManagementPath() {
// The following wont work here:
// server.embeddedServletContainer.port -> regular server port
// management.port -> is zero just as server.port as i want random ports
final int managementPort = // how can i get this one ?
final String managementPath = managementServerProperties.getContextPath()
return "http://localhost:${managementPort}${managementPath}"
}
}
Я уже знаю, что стандартный порт можно получить с помощью local.server.port
, и, кажется, есть некоторый эквивалент для конечной точки управления с именем local.management.port
. Но это, кажется, имеет другое значение.
Изменить: в официальной документации не упоминается способ сделать это: (http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-discover-the-http-port-at-runtime а>)
Есть ли в настоящее время какой-либо недокументированный способ получить доступ к этому порту управления?
Редактировать решение:
Поскольку я использую Spock-Framework и Spock-Spring для тестирования моего приложения с весенней загрузкой, мне нужно инициализировать приложение, используя:
@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = MyApplication.class)
Каким-то образом Spock-Spring или тестовая инициализация, по-видимому, влияют на оценку аннотации @Value
, так что @Value("${local.management.port}")
приводит к
java.lang.IllegalArgumentException: Could not resolve placeholder 'local.management.port' in string value "${local.management.port}"
С вашим решением я знал, что свойство существует, поэтому я просто использую пружину Environment
напрямую, чтобы получить значение свойства во время выполнения теста:
@Autowired
ManagementServerProperties managementServerProperties
@Autowired
Environment environment
public String getManagementPath() {
final int managementPort = environment.getProperty('local.management.port', Integer.class)
final String managementPath = managementServerProperties.getContextPath()
return "http://localhost:${managementPort}${managementPath}"
}