Dies ist der fünfte in der Spring Boot-Serie. Dieses Mal werde ich erklären, wie man die Quelle mit einer kleinen Änderung gegenüber der Vergangenheit stoppt.
Ich denke, dass das häufigste ist ** Mockito in UT oder Spott durch Wiremock in FT **. Wenn Sie bootRun ausführen, funktioniert jeder Mock nicht, sodass Sie möglicherweise Probleme mit einem HTTP-Kommunikationsfehler haben oder keine Verbindung zur Datenbank herstellen können.
Wenn Sie es nach der Methode machen, die ich von nun an einführen werde, ** In einigen Umgebungen ist es möglich, Stubs zu verwenden und die eigentliche API nur in der Umgebung aufzurufen, in der die entgegengesetzte API vorhanden ist **.
Ich hoffe, es wird für die Bedürftigen hilfreich sein! !!
Welche Methode sollte angewendet werden, um den Quellstub zu erstellen? ** Registrieren Sie die Stub-Klasse mit demselben Namen wie die Klasse, die Sie stubben möchten, im DI-Container, fügen Sie @Primary hinzu und ersetzen Sie sie **, Ich werde das machen.
Es erscheint mehrmals in meinem Artikel, aber ich verwende die ** Postleitzahlensuch-API **. Wie der Name schon sagt, handelt es sich um eine API, die Adressinformationen im Antworttext zurückgibt, wenn Sie eine Postleitzahl für einen Abfrageparameter anfordern.
Informationen zur Implementierung finden Sie unter hier. Lassen Sie uns bootRun und treffen, welche Art von Ergebnis zurückgegeben wird.
Versuchen Sie zunächst, eine vorhandene Adresse anzufordern. Sie haben die Postleitzahl und die Präfekturcode erfolgreich erhalten. Das normale System sieht so aus.
Was aber, wenn Sie eine nicht vorhandene Adresse anfordern?
Wenn Sie eine nicht vorhandene Postleitzahl eingeben, erhalten Sie natürlich eine leere Antwort **.
… Was wäre, wenn Sie diese App in einer Umgebung veröffentlichen müssten, in der die ** Postleitzahlensuch-API nicht vorhanden ist? ** ** ** Es ist unnötig zu erwähnen, dass Sie unabhängig von der von Ihnen angeforderten Postleitzahl einen 404-Fehler ** erhalten und dieser unbrauchbar wird.
Lassen Sie uns einen ** Stub machen und uns damit ** für einen solchen Fall befassen! !!
Ich denke, es ist leichter vorstellbar, wenn man sich die Implementierungsklasse ansieht. Stellen Sie zuerst die Implementierungsklasse.
MockClient.java
@Configuration // (1)
public class MockClient {
@Bean // (1)
@Primary // (1)
public GetAddressApiClient mockGetAddressApiClient(RestTemplateBuilder restTemplateBuilder,
ResponseHandlerInterceptor interceptor) {
return new MockGetAddressApiClient(restTemplateBuilder, interceptor);
}
static class MockGetAddressApiClient extends GetAddressApiClient { // (2)
MockGetAddressApiClient(RestTemplateBuilder restTemplateBuilder,
ResponseHandlerInterceptor interceptor) {
super(restTemplateBuilder, interceptor);
}
@Override
public GetAddressApiResponse request(String zipCode) {
return new GetAddressApiResponse( // (3)
"200",
"",
Arrays.asList(
new GetAddressApiResponse.Result(
"zipcode",
"prefcode",
"address1",
"address2",
"address3",
"kana1",
"kana2",
"kana3"
),
new GetAddressApiResponse.Result(
"zipcode",
"prefcode",
"address1",
"address2",
"address3",
"kana1",
"kana2",
"kana3"
)
)
);
}
}
}
Ich werde jeden Punkt erklären!
Die Bean-Definition durch Annotation ist im Frühjahr möglich, und die Stub-Klasse wird im DI-Container registriert, wobei zu diesem Zeitpunkt "@ Configuration" + "@ Bean" verwendet wird.
Zu diesem Zeitpunkt gibt es jedoch zwei Beans mit demselben Namen, da der echte "GetAddressApiClient" ebenfalls registriert ist, und Spring löst eine Ausnahme aus. ** ** **
Verwenden Sie ** @ Primary
**, um es zu umgehen!
Infolgedessen erhält der mit "@ Primary" Priorität.
Mit anderen Worten, ** die Stub-Klasse wird immer verwendet **.
Erstellen Sie als Nächstes die Stub-Klasse selbst. Wie oben erwähnt, ist es diesmal erforderlich, die Bean mit demselben Typ wie die reale Klasse zu registrieren. Erstellen Sie dazu ** eine Stub-Klasse, indem Sie die reale Klasse erben **. Es ist relativ wichtig.
@ Override
die Methode und definieren Sie den RückgabewertDer Rest ist die Definition des Rückgabewerts. In diesem Fall überschreiben Sie die "request" -Methode, um einen beliebigen Rückgabewert zurückzugeben.
Lassen Sie uns bootRun und schlagen. Da die in den Stub geschriebene Antwort zurückgegeben wird, Es scheint, dass es erfolgreich erstochen wurde!
… Aber hier ist eine andere Frage. ** "Dieser Stub funktioniert immer, also funktioniert die echte Klasse vielleicht nicht?" ** …Korrekt. Diesmal ist es im Gegenteil eine Anwendung geworden, die nur mit Stubs funktioniert.
Also ** Machen wir es möglich, das Original und den Stub für jede Umgebung richtig zu verwenden! !! ** ** **
** Füge @ Profile
zur Stub-Klasse hinzu **.
Infolgedessen ** wird die Stub-Klasse nur in der angegebenen Umgebung DI-registriert, und die Stub-Klasse wird in der nicht angegebenen Umgebung nicht DI-registriert (≒ real works) **.
MockClient.java
@Configuration
@Profile("dev")
public class MockClient {
//Kürzung
}
Im obigen Fall ist es nur in der "dev-Umgebung" eine Stub-Klasse, und die echte Client-Klasse funktioniert in anderen Umgebungen!
Danke, dass du bis zum Ende zugesehen hast! Als ich es nachgeschlagen habe, habe ich festgestellt, dass es nicht viele Artikel wie diesen gibt, also hoffe ich, dass es jemandem hilft!
Wir freuen uns über Ihre Kommentare und Kommentare!
Recommended Posts