spring boot tests - 春季启动前如何启动嵌入式服务器?

时间:2015-11-06 15:53:06

标签: java spring spring-boot integration-testing

在经常编写集成测试时,需要在临时端口上启动某个服务器(例如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)
        }
    }
}

1 个答案:

答案 0 :(得分: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