2015-11-06 60 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

這是不相關的問題...我的問題與環境中的其他服務器相關,而不是在Spring Boot中嵌入http。 – mabn