Correction d'une application commerciale Spring Boot. Il existe un endroit dans l'application qui utilise RestTemplate pour appeler l'API REST d'autres systèmes liés, et le test unitaire, y compris cette partie, a été effectué en configurant un serveur simulé avec WireMock.
Quand j'ai ajouté un test en fonction de la rénovation, le test existant du coup
NoHttpResponseException:[server] failed to respond
J'ai commencé à mousser avec des exceptions.
Il semble que ce ne soit pas une erreur du test lui-même car il est dans un état où il réussit lorsque le test est exécuté seul et il est mousse lorsqu'il est exécuté à travers lui. L'enquête a donc commencé.
Cela semble être un bogue qui se produit lorsque HttpURLConnection est utilisé pour le client Http de l'application qui accède à WireMock.
https://github.com/tomakehurst/wiremock/issues/97 Spring Rest Template utilise également HttpURLConnection en interne, il est donc applicable.
Utilisez une maquette de fil à ressort-nuage-contrat.
https://github.com/tomakehurst/wiremock/issues/97 Le problème présente plusieurs types de contre-mesures, il semble donc que vous devriez adopter celle que vous aimez. Les critères de sélection sont les suivants.
Augmentez la version de Spring Boot ou changez HttpClient Puisqu'il s'agit d'une application commerciale, les changements de configuration sont fondamentalement NG pour les tests → ✕
Désactiver la réutilisation de connexion pour HttpClient Je ne sais pas où le définir et cela peut affecter le fonctionnement de l'application → ✕
Utilisation d'un simulacre de fil à ressort-nuage-contrat Terminé en changeant la bibliothèque de test → ○
Comme son nom l'indique, spring-cloud-contract-wiremock utilise wireMock en interne, les modifications apportées au code de test étaient donc minimes. Plus précisément, changez simplement la notation des paramètres du serveur et spécifiez le répertoire de la ressource de test existante. Voir Officiel pour une utilisation détaillée.
Configuration(before)
public class ExampleUnitTest {
@Rule
public WireMockRule wireMockRule = new WireMockRule(8080);
....
Configuration(after)
@AutoConfigureWireMock(port = 8080, stubs = "classpath*:/META-INF/**/mappings/**/*.json")
public class ExampleUnitTest {
....
Comme mentionné ci-dessus, dans mon cas, le code de test existant peut être passé tel quel simplement en changeant le chemin de la ressource de test spécifiée par stubs =
.
Recommended Posts