J'utilise Spring Boot 1.5 pour mon application. Dans les tests d'intégration, je souhaite récupérer le numéro de port d'exécution du serveur Web (note: TestRestTemplate n'est pas utile dans mon cas.). J'ai essayé quelques approches mais aucune ne semble fonctionner. Ci-dessous sont mes approches.
Première approche
@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {
@LocalServerPort
protected int port;
Dans mon fichier src/main/resources/config/application.properties
, j'ai défini le port du serveur comme
server.port = 8081
Mais avec ce code je reçois une erreur
Impossible de résoudre l'espace réservé 'local.server.port' dans la valeur "$ {local.server.port}"
Deuxième approche
J'ai changé
webEnvironment = WebEnvironment.DEFINED_PORT
à
webEnvironment = WebEnvironment.RANDOM_PORT
et dans mon fichier src/main/resources/config/application.properties
j'ai défini
server.port = 0
Cela jette le même erreur que la première approche.
Troisième approche
En troisième approche, j'ai essayé d'utiliser
protected int port;
@Autowired
Environment environment
this.port = this.environment.getProperty("local.server.port");
cela retourne null
valeur
Quatrième approche
Enfin, j'ai essayé d'utiliser ApplicationEvents
pour trouver le numéro de port en créant un écouteur d'événement pour écouter EmbeddedServletContainerIntialize
@EventListener(EmbeddedServletContainerInitializedEvent.class)
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
this.port = event.getEmbeddedServletContainer().getPort();
}
public int getPort() {
return this.port;
}
Ajout du même à TestConfig
Maintenant, dans ma classe de test, j'ai essayé d'utiliser cet écouteur pour obtenir le port
@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.RANDOM_PORT)
public class RestServiceTest {
protected int port;
@Autowired
EmbeddedServletContainerIntializedEventListener embeddedServletcontainerPort;
this.port = this.embeddedServletcontainerPort.getPort();
cela retourne 0
. De plus, j'ai découvert que l'écouteur n'est jamais déclenché.
C'est très simple, comme dans la documentation et d'autres publications, mais cela ne fonctionne pas pour moi. L'aide est très appréciée.
Peut-être avez-vous oublié de configurer le port aléatoire pour votre environnement Web de test.
Cela devrait faire l'affaire: @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
Voici un test qui vient d’être exécuté avec Spring Boot 1.5.2:
import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class RandomPortTests {
@Value("${local.server.port}")
protected int localPort;
@Test
public void getPort() {
assertThat("Should get a random port greater than zero!", localPort, greaterThan(0));
}
}
Vous avez oublié de placer @RunWith(SpringRunner.class)
au-dessus de votre décoration de classe.
Alors, essayez ceci.
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class, webEnvironment =WebEnvironment.DEFINED_PORT)
public class RestServiceTest {
@LocalServerPort
int randomServerPort;
...
}