web-dev-qa-db-fra.com

Matchers.any () pour la valeur null dans Mockito

Supposons que j'ai cet objet objectDemo qui appelle la méthode objectDemoMethod avec 2 paramètres String et null. Maintenant, je veux vérifier que cette méthode a été appelée avec Mockito:

objectDemo.objectDemoMethod("SAMPLE_STRING", null);

J'ai écrit ceci:

Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), null);

mais ça donne une erreur:

Utilisation non valide des correspondances d'arguments pour la valeur null.

Existe-t-il un autre moyen de transmettre la valeur null?

28
Avinash Jadhav

Le message d'erreur que vous obtenez est attendu car vous utilisez un correcteur d'arguments pour un seul argument et pas l'autre. De Matchers Javadoc:

Si vous utilisez des correspondants d'arguments, , tous les arguments doivent être fournis par les correspondants.

Par conséquent, le correctif consiste à utiliser également un correcteur pour le deuxième paramètre de la méthode. Dans ce cas, ce serait un correcteur correspondant à null. Selon la version de Mockito et Java, vous pouvez avoir:

  • À partir de Mockito 2, vous pouvez utiliser ArgumentMatchers.isNull() . Cela fonctionne avec Java 8 et versions supérieures:

    verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull());
    

    Notez que si vous utilisez Java 7 ou une version antérieure, vous aurez besoin d’une conversion explicite pour que cela fonctionne, car l’inférence de type dans ces versions de Java ne prend pas en compte. compte les types de la méthode appelée:

    verify(objectDemo, times(1)).objectDemoMethod(any(String.class), (String) isNull());
    
  • Si vous utilisez Mockito 1, vous pouvez utiliser le Matchers.isNull(clazz) :

    verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull(String.class));
    

Pour les cas Java ≤ 7 ou Mockito 1, les exemples utilisent un cas où le deuxième paramètre était de type String: il devrait être remplacé par le type réel du paramètre de méthode.

56
Tunaki

isNull semble être obsolète

Avec Java 8 cette méthode sera supprimée dans Mockito 3.0. Cette méthode n’est utilisée que par souci de convivialité générique afin d’éviter le lancement; elle n’est plus nécessaire dans Java 8 .

Je pense que vous pourriez utiliser nullable:

  • public static <T> T nullable(Class<T> clazz)

Vous pourriez utiliser quelque chose comme:

verify(objectDemo, times(1)).objectDemoMethod(any(String.class), isNull(String.class));

Il suffit d'utiliser:

Mockito.verify(objectDemo, Mockito.times(1)).objectDemoMethod(Matchers.any(String.class), (ClassName) isNull());

Ci-dessus, aidez-moi dans Java 8. J'espère que cela vous aidera.

1
ankit