2010-11-15 29 views
19

Supposons un extrait de code de test:Existe-t-il un moyen d'avoir quelque chose comme l'argument de message jUnit Assert dans la méthode de vérification de Mockito?

méthode
Observable model = Class.forName(fullyQualifiedMethodName).newInstance(); 
Observer view = Mockito.mock(Observer.class); 
model.addObserver(view); 
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    Mockito.verify(
    view, Mockito.atLeastOnce() 
).update(Mockito.<Observable>any(), Mockito.<Object>any()); 
} 

Mockito.verify lance une exception si une méthode dans un modèle n'a pas invoqué la méthode Observable.setChanged(). Problème: sans ajouter loggers/System.print.out Je ne peux pas réaliser quelle est la méthode actuelle qui a échoué le test. Est-il possible d'avoir quelque chose de similaire à jUnit Assert méthodes:

Assert.assertEquals(
    String.format("instances %s, %s should be equal", inst1, inst2), 
    inst1.getParam(), 
    inst2.getParam() 
); 

SOLUTION:

verify(observer, new VerificationMode() 
{ 
    @Override 
    public void verify(VerificationData data) 
    { 
    assertTrue(
     format(
      "method %s doesn't call Observable#setChanged() after changing the state of the model", 
      method.toString() 
     ), 
     data.getAllInvocations().size() > 0); 
    } 
}).update(Mockito.<Observable>any(), Mockito.<Object>any()); 

Répondre

17

Cela fait l'affaire (simple et clair):

try { 
verify(myMockedObject, times(1)).doSomthing(); 
} catch (MockitoAssertionError e) { 
    throw new MockitoAssertionError("Was expecting a call to myMockedObject.doSomthing but got "+ e.getMessage()); 
} 
+6

Passer la cause en second argument est généralement préférable à la concaténation du message. 'throw new MockitoAssertionError (" message ", e)' – Kapep

+1

MockitoAssertionError n'a pas de constructeur avec les paramètres MockitoAssertionError (String, Exception) J'utilise 'new AssertionError (" message ", exception)' à la place car c'est le type d'exception est jeté par JUnit pour les assertions. –

3

Il n'y a pas un appel API directe qui permet à un message sur le vérifier. Mais je pense que si vous changez votre signature de vérification pour utiliser l'objet de la méthode plutôt que Mockito.any(), le toString() de la classe Method va démarrer et vous donner ce que vous voulez.

Quelque chose comme ça.

import static org.mockito.Matchers.anyObject; 
import static org.mockito.Mockito.atLeastOnce; 
import static org.mockito.Mockito.verify; 
import static org.mockito.Matchers.eq; 

... 

Observable model = Class.forName("class name").newInstance(); 

verify(view, times(1)).update(eq(model), anyObject()); 

for (Method method : Class.forName("class name").getDeclaredMethods()) 
{ 
    method.invoke(model, composeParams(method)); 
    model.notifyObservers(); 
    verify(view, atLeastOnce()).update(eq(method), anyObject()); 
} 
+0

Bien essayé, mais ça ne va pas au travail. La première méthode de la mise à jour Observer # (Object source, Object arg) est le modèle qui diffuse le changement et non la méthode qui a changé d'état. –

+0

Ajoutez simplement l'attente que vous voulez voir. Si cela inclut un autre type d'observable alors qu'il en soit ainsi. –

+0

Vous avez probablement besoin d'ajouter plus de code qui explique mieux la structure de votre classe. –

1

Vous pouvez créer un modèle pour imprimer des informations sur la méthode en cours. Ça va être un peu maladroit, mais ça va fonctionner imprimer le nom de la méthode lorsque la vérification échoue.

6

Vous ne pouvez pas faire en mockito. La syntaxe de Mockito rend très facile à tester le comportement attendu, mais elle n'a pas de concept d'état de test.

Ce que vous essayez de faire est d'avoir des informations qui ne sont pas dans l'objet mocké lorsque les fausses échoue les attentes.

Si vous voulez vraiment faire, je vois 2 façons générales: soit vous créez votre propre verificationMode implémentant l'interface

org.mockito.verification; 
public static interface VerificationMode 

et l'ajout d'une méthode comme atLeastOnceMsd (String msg) qui affichera le message dans cas d'échec ou ajout de la méthode testée en cours dans le modèle à l'objet de vue

par exemple avec une ligne similaire dans la boucle interne.

view.setName("now we are testing " + method.getName());