web-dev-qa-db-fra.com

Impossible de définir le port du serveur local d'exécution dans Spring Boot Test 1.5

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.

6
Meena Chaudhary

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));
    }

}
8
Kevin Peters

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;
     ...
}
1
Kin Cheung