2016-08-16 5 views
1

스프링 부트 통합을 통해 무작위로 자유롭게 포트를 생성 할 수 있습니다. 그러나 나는 또한 Redis를위한 무료 포트가 필요합니다.스프링 부트 통합 테스트 무작위 무료 포트

@ContextConfiguration(classes = {MyApplication.class}, loader = SpringApplicationContextLoader.class) 
@WebIntegrationTest(randomPort = true, value = "server.port:0") 
@ActiveProfiles(profiles = {"local"}) 
public class SegmentSteps { 

    private static final String HOST_TEMPLATE = "http://localhost:%s"; 

    // Needs to be a random open port 
    private static final int REDIS_PORT = 6380; 

    private String host; 
    @Value("${local.server.port}") 
    private int serverPort; 

    private RedisServer redisServer; 

    @Before 
    public void beforeScenario() throws Exception { 
     host = String.format(HOST_TEMPLATE, serverPort); 
     redisServer = RedisServer.builder() 
       .redisExecProvider(RedisExecProvider.defaultProvider()) 
       .port(REDIS_PORT) 
       .setting("bind 127.0.0.1") 
       .build(); 
     redisServer.start(); 
    } 

    ... 
} 

어떻게해야합니까?

답변

7

당신은 가능한 포트를 얻기 위해 스프링 프레임 워크의 SocketUtils를 사용할 수 있습니다

int redisPort = SocketUtils.findAvailableTcpPort(); 
+0

인가 문맥 안에 동일한 수를 얻는 방법 있는가? – ptimson

+0

아니면 그냥 int bean을 사용합니까? 한정어로? – ptimson

+0

@ptimson, 귀하의 질문에 이해가되지 않습니다. 당신은 정교 할 수 있습니까? – mre

0

을 또한 중 하나는 사용자가 선택한 자바 클라이언트를 사용하거나 Overcast을 활용하여 부두 노동자 이내에 레디 스를 실행할 수 있습니다. 흐림을 사용하여 exposeAllPorts 옵션을 활성화하면 Redis는 호스트 시스템의 임의의 포트에 바인딩됩니다. 당신이 컨텍스트에서 속성을 가능하게 할 수있는 방법에 관해서는

- 그것은 몇 가지 작업을 필요로하지만 도커 용기를 시작할 것 리스너를 구현하고있는 환경에서 속성으로 포트를 둘 수 있었다 :

public class IntegrationTestBootstrapApplicationListener implements 
    ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered { 

    public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 4; 
    public static final int PROPERTY_SOURCE_NAME = "integrationTestProps"; 

    private int order = DEFAULT_ORDER; 

    public void setOrder(int order) { 
     this.order = order; 
    } 

    @Override 
    public int getOrder() { 
     return this.order; 
    } 

    @Override 
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { 
     ConfigurableEnvironment environment = event.getEnvironment(); 

     if (!environment.getPropertySources().contains(PROPERTY_SOURCE_NAME)) { 
      CloudHost itestHost = CloudHostFactory.getCloudHost("redis"); 
      itestHost.setup(); 

      String host = itestHost.getHostName(); 
      // fetch the dynamic port from Docker 
      int port = itestHost.getPort(6379); 

      // alternatively, skip the whole CloudHost setup above and just use: 
      // int port = SocketUtils.findAvailableTcpPort(); 

      environment.getPropertySources().addLast(
       new MapPropertySource(
       PROPERTY_SOURCE_NAME, Collections.<String, Object> singletonMap(
        "redis.port", port)); 
      ); 
     } 
    } 

} 
+0

Great는이 프로젝트를 제공 할 것입니다. 아마도이 프로젝트에 과도한 노출이 있습니다. – ptimson

+0

그래도 생각해보십시오.하지만 Redis, RabbitMQ, PostgreSQL 및 FTP 서버와 같은 몇 가지 외부 리소스를 제공해야하는 경우에 유용한 옵션입니다. –

관련 문제