[JAVA] 05. Ich habe versucht, die Quelle von Spring Boot zu löschen

Überblick

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! !!

Hauptthema

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.

1. Versuchen Sie, RestTemplate entsprechend zu implementieren

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. 無題1.png 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? 無題2.png

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! !!

2. Implementieren Sie die Stub-Klasse

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!

(1) Registrieren Sie sich im DI-Container mit "@ Configuration" + "@ Primary (@Bean)"

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 **.

(2) Erstellen Sie eine Stub-Klasse, die die zu stubisierende Klasse erbt

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.

(3). @ Override die Methode und definieren Sie den Rückgabewert

Der Rest ist die Definition des Rückgabewerts. In diesem Fall überschreiben Sie die "request" -Methode, um einen beliebigen Rückgabewert zurückzugeben.

Versuchen Sie zu schlagen

Lassen Sie uns bootRun und schlagen. 無題.png 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! !! ** ** **

3. Geben Sie die Umgebung an, auf die der Stub angewendet wird

** 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!

Schließlich

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

05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte die Standardfehlermeldung von Spring Boot steuern
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
[Spring Boot] Ich habe untersucht, wie die Nachbearbeitung der empfangenen Anforderung implementiert werden kann.
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Ich habe die Quelle von Integer gelesen
Ich habe versucht, die Methode zu erklären
Ich habe die Quelle von Long gelesen
Ich habe GraphQL mit Spring Boot ausprobiert
Ich habe die Quelle von Short gelesen
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe die Quelle von Byte gelesen
Ich habe die Quelle von String gelesen
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, dies und das von Spring @ Transactional zu überprüfen
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich habe es mit Spring versucht.
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
Ich möchte die Methode des Controllers kennen, bei der die Ausnahme im ExceptionHandler von Spring Boot ausgelöst wurde
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
Ich habe Docker verwendet, um die Vorlage zu verfestigen, die mit Spring Boot entwickelt werden soll.
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Zusammenfassung dessen, was ich über Spring Boot gelernt habe
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
C # (Grund der Kapselung)
Ich möchte den Inhalt der Absicht var_dump
Lassen Sie uns das Gefühl von Spring Boot + Swagger 2.0 überprüfen
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich wollte Spring Boot in einem Multiprojekt gradle
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
[Ich habe es versucht] Spring Tutorial
Ich habe Spring Batch ausprobiert
03. Ich habe eine Anfrage von Spring Boot an die Postleitzahlensuch-API gesendet
Ich habe versucht, die Infrastrukturtechnologie der Ingenieure heutzutage mit dem Kochen zu vergleichen.
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest