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 aberserver.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.
Sie haben der Testinfrastruktur nicht mitgeteilt, dass Sie einen webbasierten Test ausführen. Versuchen Sie, Ihre Testklasse mit '@ WebIntegrationTest' zu kommentieren. –
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
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. –