Java >> Tutoriel Java >  >> Tag >> Spring

Définir la propriété avec le port aléatoire wiremock dans le test de démarrage du printemps

Envisagez d'utiliser Spring Cloud Contract Wiremock

Il existe déjà un générateur de règles JUnit qui permet de spécifier ${wiremock.port} pour définir un port aléatoire dans les fichiers de propriété/yaml

Ou vous pouvez utiliser WireMockRestServiceServer pour lier WireMock à votre RestTemplate vous n'avez donc même pas besoin de remplacer les URL dans vos tests.


Je n'ai pas trouvé de moyen de remplacer les propriétés dans un test d'intégration Spring Boot, car le test n'est exécuté qu'après la création de l'application et tous les beans déjà configurés.

Pour contourner le problème, j'ai ajouté un @TestConfiguration au test pour remplacer les beans dans l'application :

private static WireMockServer wireMockServer1 = getWireMockServer();
private static WireMockServer wireMockServer2 = getWireMockServer();
private static WireMockServer wireMockServer3 = getWireMockServer();

private static WireMockServer getWireMockServer() {
    final WireMockServer wireMockServer = new WireMockServer(options().dynamicPort());
    wireMockServer.start();
    return wireMockServer;
}

@TestConfiguration
static class TestConfig {
    @Bean
    @Primary
    public BeanUsingAProperty1 getBean1() {
        BeanUsingAProperty myBean = new BeanUsingAProperty();
        myBean.setPort(wireMockServer.port());
        return myBean;
    }

    @Bean
    @Primary
    public BeanUsingAProperty2 getBean2() {
        String baseUrl = "http://localhost:" + wireMockServer2.port();
        return new BeanUsingAProperty2(baseUrl);
    }

    @Bean
    @Primary
    public BeanUsingAProperty3 getBean3() {
        String baseUrl = "http://localhost:" + wireMockServer3.port() + "/request";
        return new BeanUsingAProperty3(new RestTemplate(), baseUrl, "someOtherParameter");
    }
}

Cela a effectivement remplacé le BeanUsingAProperty avec celui défini dans le test afin qu'il ait le bon numéro de port pour Wiremock.

Pour que cette configuration soit récupérée, j'ai dû ajouter cette classe dans l'annotation de test

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {
    MySpringBootApplication.class, MyIntegrationTest.TestConfig.class })

Notez que j'utilise l'API Wiremock non statique, car j'ai plusieurs services externes de ce type qui doivent chacun être simulés. Notez que la façon dont les différents beans sont construits est différente selon la façon dont chacun a été conçu.


Utilisez la substitution de propriété dans votre application.properties :

external.baseUrl=http://exampleUrl:${wiremock.server.port}

Cela nécessite le wiremock.server.port propriété à définir avant l'initialisation de SpringBootTest, ce qui peut être réalisé en ajoutant le @AutoConfigureWireMock annotation à votre classe de test.


Balise Java