2016-04-12 27 views
2

Tümleştirme testlerinde management.port özelliğini 0 olarak ayarlarken aktüatör bitiş noktasına hizmet veren katıştırılmış tomcat için atanan bağlantı noktasının nasıl alınacağı konusunda danışmanlık arıyorum .Spring Boot yönetim bağlantı noktasını çalışma zamanında alın. management.port = 0

server.port: 8080 
server.contextPath: /my-app-context-path 

management.port: 8081 
management.context-path: /manage 

... 

benim entegrasyon testleri daha sonra yukarıda gösterilen bağlantı noktalarını ayarlayarak, @WebIntegrationTest not eklenmiş

@WebIntegrationTest({ "server.port=0", "management.port=0" }) 

ve aşağıdaki 0 için: Aşağıdaki application.yml yapılandırma ile Bahar Boot 1.3.2 kullanılarak

Im Tam tümleştirme testleri yaparken uygulama yapılandırmasına erişmek için yardımcı sınıf kullanılmalıdır:

Zaten standart bağlantı noktasının local.server.port kullanarak edinilebileceğini biliyorum ve local.management.port adlı yönetim uç noktası için bir miktar eşdeğer gibi görünüyor. Ama bunun farklı bir anlamı var gibi görünüyor.

Düzenleme: resmi belgeler bunu yapmanın bir yolu söz etmez: (http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-discover-the-http-port-at-runtime)

o yönetim bağlantı noktası üzerinde bir el almak için herhangi bir belgesiz yolu şu anda var mı?


Çözüm Düzenleme: Ben bahar-önyükleme uygulamasının test edilmesine yönelik Spock-Framework ve Spock-Bahar kullanarak olduğum i kullanarak uygulamayı başlatmak zorunda

:

@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = MyApplication.class) 

Her nasılsa Spock-Spring veya test başlatma, @Value Ek Açıklamalarının değerlendirilmesini etkiliyor gibi görünüyor, böylece

senin çözümü ile
java.lang.IllegalArgumentException: Could not resolve placeholder 'local.management.port' in string value "${local.management.port}" 

i mülk var biliyordum, bu yüzden sadece bir test zamanında özellik değerini almak için doğrudan yayı Environment kullanın:

@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}" 
} 

cevap

4

Bu ben bunu yapmış düz kopyaladıktan nasıl benim test sınıfından (ı iddialar için RestAssured kullanın):

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.test.SpringApplicationConfiguration; 
import org.springframework.boot.test.WebIntegrationTest; 

import org.springframework.test.annotation.DirtiesContext; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

import static com.jayway.restassured.RestAssured.get; 
import static org.hamcrest.CoreMatchers.equalTo; 

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(Application.class) 
@WebIntegrationTest(randomPort = true, value = {"management.port=0", "management.context-path=/admin"}) 
@DirtiesContext 
public class ActuatorEndpointTest { 

    @Value("${local.management.port}") 
    private int localManagementPort; 

    @Test 
    public void actuatorHealthEndpointIsAvailable() throws Exception { 

     String healthUrl = "http://localhost:" + localManagementPort + "/admin/health"; 
     get(healthUrl) 
       .then() 
       .assertThat().body("status", equalTo("UP")); 
    } 



} 
+0

Teşekkür ederim @ dave-bower, çözümünüzün doğru yönde olduğunu ima ettim. – mawi

+0

Sorunum, '@ Value' Annotation'ı kullanırken bu özelliğin çözülmediği Spock-Framework ve Spock-Spring kullanıyorum. Muhtemelen Testlerimi '@ContextConfiguration (loader = SpringApplicationContextLoader.class, classes = MyApplication.class)' kullanarak başlatıyorum. Sorularımı düzenleyip Spock Testing Environment'ım için çözümü ekleyeceğim. – mawi

+0

Yardım etmesine sevindim! –

4

Bahar Boot daha kolay bir yolu yoktur 1.4.0 itibariyle:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { 
    "management.port=0", "management.context-path=/admin" }) 
@DirtiesContext 
public class SampleTest { 

    @LocalServerPort 
    int port; 

    @LocalManagementPort 
    int managementPort; 
+0

bu, org.springframework.boot.test öğesinin içe aktarılmasını gerektirir.context.SpringBootTest.WebEnvironment; –

İlgili konular