2015-11-06 2 views
0

При написании интеграционных тестов довольно часто необходимо запустить некоторый сервер (например, redis, zookeeper) на эфемерном порту, а затем передать порт как свойство Spring. Проблема заключается в том, что на самом деле используются порт неизвестен до запуска сервера, поэтому он не может быть передан с помощью аннотаций:Весенние тесты загрузки - как запустить встроенный сервер до весенней загрузки?

@IntegrationTest(["redis.port=???"]) 
class RedisTest { 
    @Before 
    before(){ 
     int port = startRedis(
    } 
} 

Что идиоматический способ для достижения этой цели? В идеале я хотел бы включить это в правило junit.

Вот то, что работает для меня, но не выглядит хорошо (проходящий через порт статической переменной):

@IntegrationTest(initializers=Initializer.class) 
public class RedisTest { 
    public static int port; 

    public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { 
     public void initialize(ConfigurableApplicationContext ctx){ 
      port = startRedis() 
      EnvironmentTestUtils.addEnvironment(ctx, "redisPort=" + port) 
     } 
    } 
} 

ответ

0
//set server.port=0 and then inject the actual (‘local’) port as a @Value 

@WebIntegrationTest("server.port:0")  
public class RedisTest{ 

    @Autowired 
    EmbeddedWebApplicationContext server; 

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

} 

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-discover-the-http-port-at-runtime

+0

Это не имеет отношения к вопросу ... Моя проблема связан с другими серверами в среде, а не с HTTP, встроенными в Spring Boot. – mabn

Смежные вопросы