8
votes

Utiliser des annotations Mockito avec le printemps

J'utilise le printemps dans ma demande et je souhaite écrire des tests d'unité pour toutes mes classes. J'appelle peu deservices externes de ma candidature et je veux les moquer d'en utilisant Mockito car je veux juste tester ma fonctionnalité.

permet de dire que j'ai le scénario suivant p>

Ceci est mon interface WebService P >

public class class1Test {

    @Spy
    MyService myService;

    @Resource
    @InjectMocks
    Class1 class1;

    public void setUPTest() {
        MockitoAnnotations.initMocks(this);
    Mockito.doReturn(123).when(myService).doSomethingElse("someString");
    }

    @Test
    public void methodToBeTestedTest() {
        this.setUPTest();
            ...
            class1.methodToBeTested();
    }

}


6 Réponses :


3
votes

A @spy code> est utilisé pour espionner ce qui se passe lorsque vous appelez des services (et utiles par exemple. ASSERT la présence ou l'absence d'invocations de méthodes transitives), ce que vous voulez est le @mock Code> Annotation:

public class class1Test {
    @Mock MyService myService;
    ...


1 commentaires

J'ai utilisé Spy ici car, il y a d'autres méthodes dans Myservice que le dosent doit être plongé. (Ceci est juste un exemple de code qui ressemble à la mienne)



1
votes

Ceci devrait correspondre à votre besoin: xxx

Voir aussi le Doc officiel .


0 commentaires

2
votes

Voulez-vous dire tanstring () plutôt que "suls" dans votre méthode ? Cela peut également être eq ("suls") si vous appelez votre méthode avec une chaîne spécifique.

De ma compréhension de Mockito, je n'utilise pas de spys car ils indiquent probablement une question de conception de classe . Pourquoi ne pas @mock l'ensemble de myservice , donc; xxx


4 commentaires

@coder, j'ai eu une conception de classe similaire jusqu'à ce que je vienne tester quand je me suis rendu compte que ma classe faisait trop de choses rendant difficile le test de l'unité. Envisagez de scinder le service de service Web à une classe de gestionnaire. De cette façon, vous pouvez construire votre classe avec le gestionnaire moqueur et éliminer le @spy . Tous les appels vers le WS peuvent ensuite être simplement moqués de l'outillage traditionnel non espagnol.


Cela résoudrait le problème, mais la triste chose est que je ne puisse pas changer la mise en œuvre originale de Myservice ou Myservice impliquer.


Ah, oui, vous avez raison d'utiliser un espion. Je n'ai pas réalisé. Ils sont particulièrement utiles lorsqu'ils traitent du code tiers / héritage. Est-ce que mes conseils sur les correspondants donnent de meilleurs résultats moqueurs?


Non, le seul problème que je suis confronté ici est avec "@resource" et "@InjectMocks" utilisé sur la même variable. La variable est initialisée d'abord avec "@Resouce" puis le dosent d'injection se produit.



2
votes

modifié, xxx


1 commentaires

Je n'ai pas de constructeur qui prend un objet comme paramètre.



3
votes

Pour remplacer votre haricon avec un simulacteur dans une utilisation de test Springockito ou mieux Springockito-annotations .

Quelque chose comme ça devrait fonctionner: p>

@ContextConfiguration(loader = SpringockitoContextLoader.class,
    locations = "classpath:/context.xml")
public class SpringockitoAnnotationsMocksIntegrationTest extends AbstractJUnit4SpringContextTests {

    @WrapWithSpy
    private MyService innerBean;

    @Resource  
    Class1 class1;

    public void setUPTest() {        
        Mockito.doReturn(123).when(myService).doSomethingElse("someString");
    }

    @Test
    public void methodToBeTestedTest() {
    this.setUPTest();
        ...
        class1.methodToBeTested();
    }


5 commentaires

J'ai vu le lien ci-dessus. Comment puis-je injecter "Myservice" Spy dans "Classe1" à l'aide de Springockito. En classe1, "myservice" est privé et n'a pas de setter.


@Coder, mis à jour. Si dans votre contexte réel myservice est injecté à la classe1 - il sera également injecté avec WrabWithSpy.


J'utilise Spring Java Config pour l'initialisation des haricots, Springockito ne le supporte pas.


@coder: semble fonctionner avec SpringockitoannoTatedContextExtloader.Class


Merci! Cela a résolu mon problème. Mais j'ai utilisé "RemplacerWithMock" avec une combinaison d'annotations "autonome" pour espionner un vrai haricot de printemps.



6
votes

J'ai résolu ceci en utilisant Spring Java Config. J'ai étendu mon fichier de configuration par défaut dans mon fichier de configuration de test.

public class class1Test {

    @Resource
    MyService myService;

    @Resource
    Class1 class1;

    public void setUPTest() {
        MockitoAnnotations.initMocks(this);
    Mockito.doReturn(123).when(myService).doSomethingElse("someString");
    }

    @Test
    public void methodToBeTestedTest() {
        this.setUPTest();
            ...
            class1.methodToBeTested();
    }

}


0 commentaires