2016-04-12 4 views
1

Ich erhalte einen -1 Wert zurückgegeben, wenn die server.port Eigenschaft von application.yml in einem Testkontext zu erhalten versuchen.

Ich mache Black-Box-Tests einer Spring-Bot-App. Hier ist ein Testfall:

@SpringApplicationConfiguration(TestConfiguration.class) 
public class StartupTest extends AbstractTestNGSpringContextTests implements EnvironmentAware { 

    private static Logger logger = LoggerFactory.getLogger(StartupTest.class); 

    @Value("${server.port}") 
    private String port; 

    @Value("${project.name}") 
    private String name; 

    private RelaxedPropertyResolver propertyResolver; 

    @Override 
    public void setEnvironment(Environment environment) { 
     this.propertyResolver = new RelaxedPropertyResolver(environment); 
    } 

    @Test 
    public void isAppUpAndRunning() { 
     logger.debug("port: " + port); 
     logger.debug("name: " + name); 
     logger.debug("value for project.name: " + propertyResolver.getProperty("project.name")); 
     logger.debug("value for server.port: " + propertyResolver.getProperty("server.port")); 
     logger.debug("value for server.servlet-path: " + propertyResolver.getProperty("server.servlet-path")); 
    } 
} 

NB: TestConfiguration.class enthält nichts anderes als @Configuration

Ausgang:

[DEBUG] com.project.StartupTest - Running with Spring Boot v1.3.3.RELEASE, Spring v4.2.5.RELEASE 
[INFO] com.project.StartupTest - The following profiles are active: test 
[INFO] com.project.StartupTest - Started StartupTest in 4.698 seconds (JVM running for 7.761) 
[DEBUG] com.project.StartupTest - port: ${server.port} 
[DEBUG] com.project.StartupTest - name: ${project.name} 
[DEBUG] com.project.StartupTest - value for project.name: MyProject 
[DEBUG] com.project.StartupTest - value for server.port: -1 
[DEBUG] com.project.StartupTest - value for server.servlet-path:/

So gibt es eigentlich zwei Fragen hier:

  • warum kann‘ t bekomme ich die Eigenschaften mit derinjiziertAnmerkung?
  • Warum kann ich alle application.yml Eigenschaften mit einer aber server.port bekommen?

Was ich brauche, schließlich ist eine bequeme Möglichkeit, all application.yml Eigenschaften in einem ‚klassischen‘ Test zuzugreifen (das heißt kein Frühling-Integrationstest, wie ich die Anwendung testen will, wie es zur Laufzeit ist). Ich habe versucht, mit

@ContextConfiguration(classes = TestConfiguration.class, initializers = ConfigFileApplicationContextInitializer.class) 

auch, aber das Problem bleibt gleich.

+0

Sie haben der Testinfrastruktur nicht mitgeteilt, dass Sie einen webbasierten Test ausführen. Versuchen Sie, Ihre Testklasse mit '@ WebIntegrationTest' zu kommentieren. –

+0

Die Sache ist, ich möchte' @ WebIntegrationTest' nicht verwenden, da ich keinen eingebetteten Container starten muss, ich möchte die Anwendung nicht starten: ich einfach Ich brauche eine Spring's RestTemplate, um meine Ruhelage zu testen. Dafür brauche ich Zugriff auf die 'application.xml'- und die Spring-Profile. Und ich habe Zugriff auf alle Eigenschaften, alles nicht mit der praktischen '@ Value' Annotation, sondern' server.port' oder 'local.server.port'. 'management.port' zum Beispiel ist verfügbar. – coolnodje

+0

Wenn Sie einen Black-Box-Test mit RestTemplate durchführen möchten, benötigen Sie einen Spring-Boot, um einen Web-Server zu starten (andernfalls werden Sie Ihre Anfragen auslösen) und der Spring-Boot-Weg dazu verwendet @WebIntegrationTest.Wenn Sie nur Ihren Controller testen möchten, können die mvc-Testklassen das tun, indem Sie den Dispatcher verspotten. –

Antwort

0

In Testfällen den Anschluss des laufenden Servers ist in der local.server.port Eigenschaft zur Verfügung:

@Value("${local.server.port}") 
private int localServerPort; 
+0

Das Einfügen von Eigenschaften mit '@ Value' funktioniert nicht, wie ich im Beitrag erwähnt habe. Außerdem ist 'local.server.port' nicht mit einem' PropertyResolver' verfügbar. – coolnodje

1

Wenn Sie einen Integrationstest nicht ausgeführt werden, SpringApplicationContextLoader explicitly sets server.port to -1. Ein Wert von -1 deaktiviert den eingebetteten Servlet-Container. Dies ist das, was Sie angefordert haben, indem Sie @WebIntegrationTest nicht verwendet haben.

+0

Richtig, das erklärt. Ich denke jedoch, dass mein Anwendungsfall ein gültiger ist: Ich führe einen Black-Box-Integrationstest während der Maven-Integrationstestphase durch, die die Spring-Boot-App mit einem ausgewählten Profil startet und mich so viele Tests ausführen lässt, wie ich möchte um einen Webserver für jeden neu zu starten. Es ist ein ergänzender Ansatz für mich, ich verwende Spring WebIntegrationTest während des Unit-Tests und Black-Box/Integration Test. Das ist völlig in Ordnung und läuft sehr gut zusammen. – coolnodje

+0

Es ist nur, dass ich Zugriff auf die 'application.yml'-Eigenschaften zur Testlaufzeit haben muss, was ich dank '@ SpringApplicationConfiguration' mache, aber dann kann ich nicht die einzige Eigenschaft bekommen, die anscheinend einen speziellen Status hat, und eine sehr wichtige one: 'server.port' Fühlst du, dass es eine legitime Eigenschaft ist, die ich anfordern könnte? – coolnodje

+0

Entschuldigung, ich verstehe nicht wirklich, was Sie versuchen zu tun. Beachten Sie, dass "application.yml" nicht die einzige Quelle für den Wert einer Eigenschaft ist. Sie erhalten den Wert von 'server.port', es wurde nur auf' -1' gesetzt, da Sie der Testinfrastruktur mitgeteilt haben, dass der eingebettete Container nicht gestartet werden soll. Diese Einstellung hat Vorrang vor dem, was in 'application.yml' steht, sonst würde der eingebettete Container gestartet, obwohl Ihre Testkonfiguration nicht so sein sollte. –

1

Ich hatte das gleiche Problem, die @Value Annotation im Integrationstest füllte die Eigenschaften nicht mit Werten (stattdessen war der Platzhalter $ {..} drin).

I ‚gelöst‘ es jetzt durch die PropertyPlaceholderAutoConfiguration.class zum @SpringApplicationConfiguration Zugabe, das heißt:

@SpringApplicationConfiguration(TestConfiguration.class, PropertyPlaceholderAutoConfiguration.class) 

Jedoch habe ich nicht sehr glücklich bin mit diesem so öffnete ich eine Frage, wie man dies richtig zu machen: Spring boot integration test with SpringApplicationConfiguration doesn't seem to resolve @Value annotation

Verwandte Themen