0
votes

Comment tester Junit sur RestTemplate?

J'ai un problème pour se moquer de la touche RestTemplate avec Mockito

Code Vous souhaitez être TEST: P>

@Mock
RestTemplate restTemplate=mock(RestTemplate.class);
@Test
public void testGetfeature(){
string testResponse= "\"feature\": 1";
Mockito.when((String)restTemplate.postForObject(
                Mockito.any(String.class),
                Mockito.any(Map.class),
                Mockito.any(Class.class)
                )).thenReturn(testResponse);
Feature feature = new Feature();
feature.getfeature("http://mockValue");
}


7 commentaires

Vous créez un nouveau Resttemplate objet dans la méthode GetFeature ().


hors sujet. Vous vous moquez deux fois. avec simulation () et @mock


Vous ne pourrez peut-être pas à cela puisque vous n'utilisez pas de simulacre mais réelle impliquer. nouvelle plaque de repos ();


S'il vous plaît pourriez-vous montrer n'importe quel exemple de code pour tester la plaque de repos, THX


Pourquoi testez-vous quelque chose qui ne fait pas partie de votre code? Vous ne testez pas la plaque de repos, mais tout ce qui l'entoure. Le meilleur serait de faire votre util non statique et de fournir une instance de modèle de repos à utiliser - elle serait simulée dans votre cas.


C'est exactement le but de injection de dépendance - vous devez transmettre le simulateur comme paramètre sur votre Constructeur constructeur (et utilisez Restopérations ; il est signifié pour ça).


La fonction GetFeature est plus compliquée que mon spectacle ci-dessus. Je veux juste se moquer du restemplate.postorobject et de retourner une test de test. Donc, à chaque fois, Resttemplate.postorobject soit appelé dans la classe d'entités, il retournera TestResponse. At-il un moyen de le faire?


4 Réponses :


0
votes

Il n'est pas nécessaire de créer constamment un objet Resttemplaire.

Vous pouvez en créer un et injecter dans la classe.

Ensuite, dans votre test de l'unité, créez un simulacteur de repos et d'injecter cela.

EDIT:
Concernant la méthode statique. N'utilisez pas une méthode statique, c'est terrible. Si vous utilisez le ressort (ou tout autre cadre d'injection de dépendance) Il suffit d'injecter une instance de où que vous souhaitiez effectuer l'appel de repos.

aussi, Dans le monde printanent Caractéristique est une classe de service. Utilisez l'annotation @service et faites la méthode non statique.


5 commentaires

c'est une méthode statique, vous ne pouvez pas utiliser les champs d'instance


Ne faites pas son statique alors. Mauvais conception difficile à tester


A un moyen de ne pas changer la classe d'entités et de faire le test?


@lin essayer la réponse ci-dessus que j'ai mentionnée


@Pradeep j'essaie la réponse ci-dessus, mais le Json retourne null, ça ne retourne pas "Json"



2
votes

Vous créez une nouvelle Resttemplate code> objet dans getfeature () code> méthode. Ainsi, moqueur Resttemplate code> n'a aucun effet. Soit prendre restontemplate code> comme argument dans getfeature () code> méthode ou prenez-le comme argument de constructeur dans Fonction code> classe.

puis de la classe d'essai , vous pouvez vous moquer de se moquer de sommet et le transmettre comme ci-dessous: p> xxx pré>

ou p> xxx pré>

Vous devez apporter les modifications nécessaires La classe d'entités basée sur la décision. p>

Voici l'échantillon de code d'exécution: p>

Classe principale: strong> p>

public class FeatureTest {
    @Test
    public void testFeature() {
        RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
        Mockito.when(restTemplate.postForObject(Mockito.any(String.class),
                Mockito.any(Object.class), Mockito.any(Class.class))).thenReturn("abc");
        System.out.println(Feature.getFeature("http://abc", restTemplate));
    }
}


9 commentaires

J'ai effectué une modification sur la classe d'entités et transmettez MockRestTemplate dans la fonction, puis le JSON Retour NULL au lieu de la TestResponse


Lorsque vous vous moquez de la réponse, vous correspondez à la chaîne, carte et classe. Mais je vois que vous utilisez une chaîne, une chaîne et une classe. Pouvez-vous utiliser Mockito.anyObject () à la place?


retourne toujours null


@lin j'ai ajouté un échantillon de code d'exécution, veuillez vérifier.


au lieu de passer mokito.anyObject, je passe le XML, l'URL et String.class dans la fonction de test et ça marche


Tu ne fais-tu pas quelque chose comme ça? Mockito.Lorsquent (Resttemplate.PostForObject (Scarito.any (String.col), Mockito.La (Object.class), Mockito.La (Class.Class))). Sorturn ("ABC") . Pouvez-vous s'il vous plaît poster la ligne ci-dessus de votre code? Cela peut être fait de plusieurs manières. L'idée est que le type d'argument doit correspondre à l'exécution en fonction des types / valeurs spécifiées.


Mockito.Quand (Resttemplate.postorobject (URL, XML, String.class)). Sorturn ("ABC")


C'est semblable. Vous essayez de faire correspondre l'URL exacte, la charge utile XML exacte et la chaîne. Il existe de nombreuses façons de faire correspondre les valeurs des arguments. En fonction de vos différents scénarios de test, vous pouvez les faire correspondre de différentes manières.


@lin content de savoir que votre problème est résolu. Voulez-vous s'il vous plaît accepter cette réponse?



0
votes

Je pense que vous devez changer votre code pour effectuer votre test de test de l'unité au moins en utilisant Mockito ou vous devez utiliser une autre bibliothèque comme PowerMock pour simuler l'instanciation d'objet locale.

1) Créer un constructeur qui accepte la plaque de repos injecter votre simulacre.

ou

2) Créez une méthode de réglage pour injecter cette plaque de repos.

Un moyen d'autre est de créer une autre méthode dans laquelle Resttemplate peut être transmis . xxx

puis dans votre test: xxx


3 commentaires

Quand vous dites mockito.Lorsquent (Feature.Getstringasjson (MockRestTemplate, Mockurl, MockxML)). Thenreturn ("Json") La méthode d'origine sous Test (GetStringasjson) ne sera pas exécutée du tout et il sera renvoyer directement "JSON" comme spécifié. La méthode cible à tester peut avoir une autre logique commerciale que nous devons tester. Ici, l'objectif est de simuler uniquement les méthodes de repose-couche pour éviter les appels http réels sur le réseau.


Je n'ai pas testé mais mon idée est d'injecter un argument de méthode


Je te vois y répondre aussi ce qui semble être ce que je explique



0
votes

Comment utiliser Junit Test sur RestTemplate?

Nous testons ce qu'il revient.
Actuellement, votre implémentation ne fait rien lui-même, il se déléguette simplement à un Resttemplate et renvoie son résultat.

la réponse La réponse décrit la mise en œuvre (avec des valeurs larges acceptées en tant que paramètres): xxx

qui ne fait pas affirmer le Comportement réel: L'URL pourrait être erronée, le corps affiché ou la réponse pourrait être fausse et la fois pour ... et ce test ne détectera jamais cela. Enfin, des choses très importantes pourraient être fausses dans cette mise en œuvre et nous ne pouvions pas détecter cela. La valeur de ce type de test est si faible.
Étant donné que cette méthode ne s'effectue pas de la logique, cela convient mieux à un test d'intégration qui pourrait affirmer et attraper beaucoup plus de choses / problèmes dans le comportement réel: xxx


0 commentaires