Eine kommerzielle Spring Boot App wurde behoben. In der App gibt es eine Stelle, an der RestTemplate zum Aufrufen der REST-API anderer verknüpfter Systeme verwendet wird. Der Komponententest einschließlich dieses Teils wurde durch Einrichten eines Mock-Servers mit WireMock durchgeführt.
Als ich einen Test gemäß der Renovierung hinzufügte, wurde der vorhandene Test plötzlich
NoHttpResponseException:[server] failed to respond
Ich begann mit Ausnahmen zu moos.
Es scheint, dass es kein Fehler des Tests selbst ist, da er sich in einem Zustand befindet, in dem er bestanden wird, wenn der Test alleine ausgeführt wird, und Moos ist, wenn er ausgeführt wird. Also begann die Untersuchung.
Es scheint ein Fehler zu sein, der auftritt, wenn HttpURLConnection für den HTTP-Client der App verwendet wird, die auf WireMock zugreift.
https://github.com/tomakehurst/wiremock/issues/97 Spring Rest Template verwendet HttpURLConnection auch intern, sodass es anwendbar ist.
Verwenden Sie Spring-Cloud-Contract-Wire-Mock.
https://github.com/tomakehurst/wiremock/issues/97 Das Problem zeigt verschiedene Arten von Gegenmaßnahmen, daher sollten Sie anscheinend diejenige übernehmen, die Ihnen gefällt. Die Auswahlkriterien sind wie folgt.
Erhöhen Sie die Version von Spring Boot oder ändern Sie HttpClient Da es sich um eine kommerzielle Anwendung handelt, sind Konfigurationsänderungen zum Testen grundsätzlich NG → ✕
Deaktivieren Sie die Wiederverwendung von Verbindungen für HttpClient Ich weiß nicht, wo ich es einstellen soll, und es kann den Betrieb der App beeinträchtigen → ✕
Verwendung von Spring-Cloud-Contract-Wire-Mock Abgeschlossen durch Ändern der Testbibliothek → ○
Wie der Name schon sagt, verwendet Spring-Cloud-Contract-Wiremock WireMock intern, sodass die Änderungen am Testcode minimal waren. Ändern Sie einfach die Notation der Servereinstellungen und geben Sie das Verzeichnis der vorhandenen Testressource an. Eine ausführliche Verwendung finden Sie unter Offiziell.
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 {
....
Wie oben erwähnt, kann in meinem Fall der vorhandene Testcode so übergeben werden, wie er ist, indem nur der Pfad der durch stubs =
angegebenen Testressource geändert wird.
Recommended Posts