web-dev-qa-db-fra.com

Powermockito ne rien pour la méthode avec des arguments

J'ai développé une application en Java et j'essaie de créer des tests unitaires à l'aide de Powermockito (je dois ajouter que je suis novice dans les tests unitaires).

J'ai une classe appelée Resource qui a une méthode statique appelée readResources:

public static void readResources(ResourcesElement resourcesElement);

ResourcesElement est également codé par moi . Lors du test, je veux créer ma propre ressource, je souhaite donc que la méthode ci-dessus ne fasse rien . J'ai essayé d'utiliser ce code:

    PowerMockito.spy(Resource.class);
    PowerMockito.doNothing().when(Resource.class, "readResources", Matchers.any(ResourcesElement.class));

Le test unitaire lève une exception:

org.mockito.exceptions.misusing.UnfinishedStubbingException: Stubbing inachevé détecté ici: -> à org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer (PowerMockitoCore.Java:36)

Powermockito suggère également que je devrais utiliser thenReturn ou thenThrow après quand, mais il semble que la méthode 'when' renvoie vide lorsqu'elle est appelée après doNothing (ce qui est logique) ..__

PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)).....

rien n'est pas une option après quand.

J'ai réussi à faire des méthodes sans arguments pour ne rien faire, en utilisant la version à 2 arguments de la méthode. Par exemple:

PowerMockito.doNothing().when(Moduler.class, "startProcessing");

Cela fonctionne (startProcessing ne prend aucun argument).

Mais comment puis-je créer des méthodes qui prennent des arguments pour ne rien faire avec Powermockito?

12
Anakin001

Vous trouverez ci-dessous un exemple pleinement fonctionnel. Puisque vous n'avez pas posté l'exemple complet, je ne peux que supposer que vous n'avez pas annoté la classe de test avec @RunWith ou @PrepareForTest car le reste semble correct.

@RunWith(PowerMockRunner.class)
@PrepareForTest({Resource.class})
public class MockingTest{

    @Test
    public void shouldMockVoidStaticMethod() throws Exception {
        PowerMockito.spy(Resource.class);
        PowerMockito.doNothing().when(Resource.class, "readResources", Mockito.any(String.class));

        //no exception heeeeere!
        Resource.readResources("whatever");

        PowerMockito.verifyStatic();
        Resource.readResources("whatever");
    }

}

class Resource {
    public static void readResources(String someArgument) {
        throw new UnsupportedOperationException("meh!");
    }
}
19
Morfic

Pourquoi traverser tant de difficultés juste pour que votre méthode ne fasse rien. Le simple fait d'appeler PowerMockito.mockStatic(Resource.class) devrait remplacer toutes les méthodes statiques de votre classe par des stubs par défaut, ce qui signifie fondamentalement qu'elles ne font rien.

À moins que vous ne souhaitiez changer le comportement de votre méthode pour que vous fassiez quelque chose en appelant simplement PowerMockito.mockStatic(Resource.class), cela devrait suffire. Bien sûr, cela signifie également que toutes les méthodes statiques de la classe sont écrites et que vous devez en tenir compte.

3
Aniket Thakur

Si doNothing() ne fonctionne pas, vous pouvez le modifier un peu en utilisant PowerMockito.doAnswer(). Cela vous permet de vous moquer des méthodes void qui sont supposées faire quelque chose, comme définir des valeurs, etc. Si doNothing() ne fonctionne pas, utiliser un doAnswer() vierge devrait fonctionner correctement.

Exemple:

PowerMockito.doAnswer(new org.mockito.stubbing.Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        return null; //does nothing
    }
}).when(mockObject).methodYouWantToDoNothing(args);
2
Walls

Peut-être que je ne peux pas comprendre votre question, mais je pense qu'il est nécessaire de spécifier ce qu'il faut faire. La méthode, donc si vous ne spécifiez pas thenReturn ou thenThrow ou quoi que ce soit que powerMockito ne sache pas ce qu'il faut faire pour lire votre vrai code , par exemple:

VRAI CODE:

            IPager pag;
        IPagerData<List<IDeute>> dpag;
        pag = new PagerImpl();
        pag.setFiles(nombrefilesPaginador);
        pag.setInici(1);
        dpag = gptService.obtenirDeutes(idSubjecte, idEns, tipusDeute, periode, pag);

Test du code réel par mockito:

        IPager pag = new PagerImpl();
        pag.setInici(1);
        pag.setFiles(0);
        when(serveiGpt.obtenirDeutes(eq(331225L),
         eq(IConstantsIdentificadors.ID_ENS_BASE), 
         Matchers.any(ETipusDeute.class),
         Matchers.any(EPeriodeDeute.class), 
         eq(pag)))
        .thenThrow(new NullPointerException(" Null!"));

Si je ne spécifie pas le retour, mon test sera un échec ..___ J'espère que cela aidera.

0
ZaoTaoBao