web-dev-qa-db-fra.com

Comment puis-je simuler une méthode statique qui renvoie void avec PowerMock?

J'ai quelques méthodes util statiques dans mon projet, certaines d'entre elles passent ou jettent une exception. Il y a beaucoup d'exemples sur la façon de se moquer d'une méthode statique qui a un type de retour autre que void. Mais comment puis-je me moquer d'une méthode statique qui retourne void à "doNothing()"?

La version non-vide utilise ces lignes de codes:

@PrepareForTest(StaticResource.class)

...

PowerMockito.mockStatic(StaticResource.class);

...

Mockito.when(StaticResource.getResource("string")).thenReturn("string");

Cependant, si elle est appliquée à un StaticResources qui retourne void, la compilation se plaindra que when(T) ne s'applique pas à void ...

Des idées?

Une solution de contournement consisterait probablement à renvoyer toutes les méthodes statiques Boolean au succès, mais je n'aime pas les solutions de contournement.

56
Pete

Vous pouvez le faire de la même manière que vous le faites avec Mockito sur des instances réelles. Par exemple, vous pouvez chaîner des stubs, la ligne suivante fera en sorte que le premier appel ne fasse rien, puis le second et futur appel à getResources lève l'exception:

// the stub of the static method
doNothing().doThrow(Exception.class).when(StaticResource.class);
StaticResource.getResource("string");

// the use of the mocked static code
StaticResource.getResource("string"); // do nothing
StaticResource.getResource("string"); // throw Exception

Grâce à une remarque de Matt Lachman, notez que si la réponse par défaut n’est pas modifiée au moment de la création de maquette, la maquette ne fera rien par défaut. Par conséquent, écrire le code suivant équivaut à ne pas l'écrire.

doNothing().doThrow(Exception.class).when(StaticResource.class);
StaticResource.getResource("string");

Cela dit, il peut être intéressant pour les collègues qui liront le test de ne rien attendre pour ce code particulier. Bien sûr, cela peut être adapté en fonction de la façon dont est perçu compréhensibilité du test.


En passant, à mon humble avis, vous devriez éviter de vous moquer de code statique si vous créez un nouveau code. Chez Mockito, nous pensons qu’il s’agit en général d’une allusion à une mauvaise conception, car cela pourrait conduire à un code mal géré. Bien que le code hérité existant soit encore une autre histoire.

De manière générale, si vous devez vous moquer d'une méthode privée ou statique, cette méthode en fait trop et doit être externalisée dans un objet qui sera injecté dans l'objet testé.

J'espère que ça t'as aidé.

Cordialement

31
Brice

Vous pouvez stub une méthode de vide statique comme ceci:

PowerMockito.doNothing().when(StaticResource.class, "getResource", anyString());

Bien que je ne sois pas sûr de la raison, parce que lorsque vous appelez mockStatic (StaticResource.class), toutes les méthodes statiques de StaticResource sont écrites par défaut.

Plus utile, vous pouvez capturer la valeur passée à StaticResource.getResource () comme ceci:

ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
PowerMockito.doNothing().when(
               StaticResource.class, "getResource", captor.capture());

Ensuite, vous pouvez évaluer la chaîne transmise à StaticResource.getResource comme suit:

String resourceName = captor.getValue();
71
Justin Rowe

En termes plus simples, imaginez si vous voulez vous moquer au-dessous de la ligne:

StaticClass.method();

alors vous écrivez ci-dessous des lignes de code pour vous moquer:

PowerMockito.mockStatic(StaticClass.class);
PowerMockito.doNothing().when(StaticClass.class);
StaticClass.method();
11
Vivek HJ

Pour se moquer d'une méthode statique qui retourne void pour par ex. Fileutils.forceMKdir(File file),

Exemple de code:

File file =PowerMockito.mock(File.class);
PowerMockito.doNothing().when(FileUtils.class,"forceMkdir",file);
4
Oshin Talreja