[JAVA] 05. J'ai essayé de supprimer la source de Spring Boot

Aperçu

C'est le cinquième de la série Spring Boot. Cette fois, j'expliquerai ** comment stuber la source ** avec un petit changement par rapport au passé.

Je pense que le plus courant est ** Mockito dans UT ou moqueur par wiremock dans FT **. Si vous bootRun, chaque maquette ne fonctionnera pas, vous pouvez donc avoir des problèmes avec l'échec de la communication HTTP ou ne pas pouvoir vous connecter à la base de données.

Si vous faites un stub par la méthode que je vais introduire à partir de maintenant ** Il est possible d'utiliser des stubs dans certains environnements et d'accéder à l'API réelle uniquement dans l'environnement où l'API opposée existe **.

J'espère que cela sera utile pour ceux qui en ont besoin! !!

Sujet principal

Quel type de méthode faut-il utiliser pour créer le stub source? ** Enregistrez la classe stub avec le même nom que la classe que vous souhaitez stub dans le conteneur DI, ajoutez @Primary et remplacez-la **, Je le ferai.

1. Essayez de mettre en œuvre en utilisant RestTemplate le cas échéant

Elle apparaît plusieurs fois dans mon article, mais j'utilise ** l'API de recherche par code postal **. Comme son nom l'indique, il s'agit d'une API qui renvoie des informations d'adresse dans le corps de la réponse lorsque vous demandez un code postal sur un paramètre de requête.

Pour l'implémentation, voir ici. BootRun et frappons quel type de résultat sera retourné.

Essayez d'abord de demander une adresse existante. 無題1.png Vous avez obtenu avec succès le code postal et le code de préfecture. Le système normal ressemble à ceci.

Mais que faire si vous demandez une adresse inexistante? 無題2.png

Bien sûr, si vous saisissez un code postal qui n'existe pas, vous obtiendrez une réponse vide **.

… Et si vous deviez lancer cette application dans un environnement où ** l'API de recherche par code postal n'existe pas? ** ** Inutile de dire que peu importe le code postal que vous demandez, vous obtiendrez une erreur 404 ** et ce sera inutile.

Faisons un ** stub et traitons-le ** pour un tel cas! !!

2. Implémentez la classe stub

Je pense que c'est plus facile à imaginer en regardant la classe d'implémentation. Tout d'abord, mettez la classe d'implémentation.

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"
                            )
                    )
            );
        }
    }
}

J'expliquerai chaque point!

(1). Enregistrez-vous dans le conteneur DI avec @ Configuration +@ Primary (@Bean)

La définition du bean par annotation est possible dans Spring, et la classe stub est enregistrée dans le conteneur DI avec @ Configuration + @ Bean utilisé à ce moment-là. Cependant, pour le moment, puisque le vrai GetAddressApiClient est également enregistré, ** il y a deux beans avec le même nom, et Spring lève une exception. ** ** Utilisez ** @ Primary ** pour le contourner! En conséquence, celui avec «@ Primary» sera prioritaire. En d'autres termes, ** la classe stub sera toujours utilisée **.

(2). Créez une classe stub qui hérite de la classe à stubiser

Ensuite, créez la classe stub elle-même. Comme mentionné ci-dessus, cette fois, il est nécessaire d'enregistrer le bean avec le même type que la classe réelle. Pour ce faire, ** créez une classe stub en héritant de la classe réelle **. C'est relativement important.

(3). @ Override la méthode et définir la valeur de retour

Le reste est la définition de la valeur de retour. Dans ce cas, remplacez la méthode request pour renvoyer toute valeur de retour que vous souhaitez.

Essayez de frapper

Démarrons et frappons. 無題.png Puisque la réponse écrite dans le stub est renvoyée, Il semble qu'il ait été poignardé avec succès!

… Mais voici une autre question. ** "Ce stub fonctionne toujours, alors peut-être que la vraie classe ne fonctionne pas?" ** …C'est vrai. Cette fois, au contraire, c'est devenu une application qui ne fonctionne qu'avec des stubs.

Alors ** Rendons possible d'utiliser correctement la chose réelle et le stub pour chaque environnement! !! ** **

3. Spécifiez l'environnement auquel le stub est appliqué

** Ajoutez @ Profile à la classe stub **. En conséquence, la classe stub sera enregistrée DI uniquement dans l'environnement spécifié, et la classe stub ne sera pas enregistrée DI dans l'environnement non spécifié (≒ la vraie chose fonctionnera) **.

MockClient.java


@Configuration
@Profile("dev")
public class MockClient {
    //réduction
}

Dans le cas ci-dessus, ce sera une classe stub uniquement dans l'environnement de développement, et la vraie classe Client fonctionnera dans d'autres environnements!

finalement

Merci d'avoir regardé jusqu'au bout! Quand j'ai cherché, j'ai trouvé qu'il n'y avait pas beaucoup d'articles comme celui-ci, alors j'espère que cela aide quelqu'un!

Nous apprécions vos commentaires et commentaires!

Recommended Posts

05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Je veux contrôler le message d'erreur par défaut de Spring Boot
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
[Spring Boot] J'ai étudié comment implémenter le post-traitement de la demande reçue.
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
J'ai lu la source de ArrayList que j'ai lu
J'ai lu la source d'Integer
J'ai essayé d'expliquer la méthode
J'ai lu la source de Long
J'ai essayé GraphQL avec Spring Boot
J'ai lu la source de Short
J'ai essayé Flyway avec Spring Boot
J'ai lu la source de Byte
J'ai lu la source de String
À propos de la fonction de Spring Boot en raison de différentes versions
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé de vérifier ceci et celui de Spring @ Transactional
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
J'ai essayé de résumer les méthodes utilisées
Je veux comprendre le flux des paramètres de demande de traitement Spring
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé Spring.
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
J'ai essayé de résumer l'API Stream
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé de résoudre le problème de Google Tech Dev Guide
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
J'ai utilisé Docker pour solidifier le modèle à développer avec Spring Boot.
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
Résumé de ce que j'ai appris sur Spring Boot
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
C # (base de l'encapsulation)
Je veux var_dump le contenu de l'intention
Vérifions la sensation de Spring Boot + Swagger 2.0
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé de configurer tomcat pour exécuter le servlet.
Je voulais classer la botte à ressort dans un multi-projet
[Spring Boot] Comment se référer au fichier de propriétés
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
[J'ai essayé] Tutoriel de printemps
J'ai essayé Spring Batch
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
J'ai essayé de comparer la technologie d'infrastructure des ingénieurs ces jours-ci avec la cuisine.
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot