Mockito - Vous ne pouvez pas utiliser l'argument de rapprochement à l'extérieur de la vérification ou de cogner - ont essayé beaucoup de choses mais toujours pas de solution
J'ai le morceau de code suivant:
PowerMockito.mockStatic(DateUtils.class); //And this is the line which does the exception - notice it's a static function PowerMockito.when(DateUtils.isEqualByDateTime (any(Date.class),any(Date.class)).thenReturn(false);
La classe commence avec:
@RunWith(PowerMockRunner.class)
@PrepareForTest({CM9DateUtils.class,DateUtils.class})
Et je reçois org.Mockito.des exceptions.InvalidUseOfMatchersException...... Vous ne pouvez pas utiliser l'argument de rapprochement à l'extérieur de la vérification ou de cogner..... (L'erreur apparaît deux fois dans l'Échec à la Trace, mais à la fois le point sur la même ligne)
Dans d'autres endroits dans mon code l'utilisation de quand est fait et qu'il fonctionne correctement. Aussi, lors du débogage de mon code, j'ai trouvé que tout(Date.class) renvoie la valeur null.
J'ai essayé les solutions que j'ai vu d'autres personnes ont trouvé utile, mais pour moi ça ne fonctionne pas:
-
L'ajout d'
@After
public void checkMockito() {
Mockito.validateMockitoUsage();
}
ou
@RunWith(MockitoJUnitRunner.class)
ou
@RunWith(PowerMockRunner.class)
-
Changement de
PowerMockito.when(new Boolean(DateUtils.isEqualByDateTime(any(Date.class), any(Date.class)))).thenReturn(false); -
À l'aide de
anyObject()
(cela ne compile pas) -
À l'aide de
notNull(Date.class)
ou(Date)notNull()
-
Remplacer
when(........).thenReturn(false);
avec
Boolean falseBool=new Boolean(false);
when(.......).thenReturn(falseBool);
- Sans testable exemple, et de noter les précisions mentionnées ci-dessous en commentaire, je ne pense pas que cette question a suffisamment de détails pour être responsable ou utile pour les futurs lecteurs. Veuillez envisager d'ajouter plus de détails. (Notez que Mockito de rapprochement transporter de l'état, de sorte que vous pouvez obtenir des exceptions semblables simplement en essayant de " sauver comparateur de valeurs pour les variables locales, et Mockito ne vais pas vous dire ce jusqu'à ce qu'un stubbing/appel de vérification beaucoup plus tard. L'affichage de votre code environnant est essentiel de diagnostiquer comparateur de problèmes.)
Vous devez vous connecter pour publier un commentaire.
Détaillées sur le PowerMockito Prise En Main Page, vous aurez besoin d'utiliser à la fois la PowerMock coureur ainsi que le
@PrepareForTest
annotation.Assurer que vous êtes en utilisant l'annotation @RunWith annotation qui vient avec JUnit 4,
org.junit.runner.RunWith
. Parce que c'est toujours accepté unvalue
attribut, c'est assez bizarre pour moi que vous recevez cette erreur si vous utilisez le bon RunWith type.any(Date.class)
est correct pour revenirnull
: Plutôt que d'utiliser de la magie "correspond à n'importe quelle Date" instance, Mockito utilise caché pile de rapprochement de suivre ce qui matcher expressions correspondent à appariés arguments et retournenull
pour les Objets (et 0 pour les entiers, et false pour les booléens, et ainsi de suite).Donc en fin de compte,ce qui a fonctionné pour moi est l'exportation de la ligne qui n'a l'exception de certains autres fonction statique. Je l'ai appelé compareDates.
Ma mise en œuvre:
Dans la classe qui est testé (e.g - MyClass)
static boolean compareDates(Date date1, Date date2) {
return DateUtils.isEqualByDateTime (date1, date2);
}
et dans la classe de test:
PowerMockito.mockStatic(MyClass.class);
PowerMockito.when(MyClass.compareDates(any(Date.class), any(Date.class))).thenReturn(false);
Malheureusement, je ne peux pas dire que je comprends tout à fait pourquoi cette solution fonctionne et la précédente n'avait pas.
peut-être que cela a à voir avec le fait que DateUtils classe n'est pas mon code, et je ne peux pas accéder à la source, seul le générés .classe fichier, mais je ne suis vraiment pas sûr à ce sujet.
MODIFIER
La solution ci-dessus est juste une solution de contournement qui ne résout pas la nécessité de couvrir le
DateUtils
isEqualByDateTime appel dans le code.Ce fait résolu le vrai problème était l'importation de la
DateUtils
classe qui a la mise en œuvre effective et non pas celle qui vient de s'étendre, ce qui est ce que j'ai importé avant.Après avoir fait ce que je pouvais utiliser la ligne d'origine
sans aucune exception.