Inachevé Stubbing Détecté dans Mockito
Je suis arriver exception suivante lors de l'exécution de tests. Je suis à l'aide de Mockito pour les moqueries. Les conseils mentionnés par Mockito de la bibliothèque ne sont pas à l'aider.
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at com.a.b.DomainTestFactory.myTest(DomainTestFactory.java:355)
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!
at a.b.DomainTestFactory.myTest(DomainTestFactory.java:276)
..........
Code de Test à partir DomainTestFactory. Quand je lance le test suivant, je vois l'exception
@Test
public myTest(){
MyMainModel mainModel = Mockito.mock(MyMainModel.class);
Mockito.when(mainModel.getList()).thenReturn(getSomeList()); --> Line 355
}
private List<SomeModel> getSomeList() {
SomeModel model = Mockito.mock(SomeModel.class);
Mockito.when(model.getName()).thenReturn("SomeName"); --> Line 276
Mockito.when(model.getAddress()).thenReturn("Address");
return Arrays.asList(model);
}
public class SomeModel extends SomeInputModel{
protected String address;
protected List<SomeClass> properties;
public SomeModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
public String getAddress() {
return this.address;
}
}
public class SomeInputModel{
public NetworkInputModel() {
this.Properties = new java.util.ArrayList<SomeClass>();
}
protected String Name;
protected List<SomeClass> properties;
public String getName() {
return this.Name;
}
public void setName(String value) {
this.Name = value;
}
}
- La ligne 355?
- Salut Mureinik , j'ai mis à jour le post avec les numéros de ligne
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la nidification se moquant de l'intérieur de se moquer. Vous appelez
getSomeList()
, qui fait un peu moqueur, avant que vous avez terminé la dérision pourMyMainModel
. Mockito ne l'aime pas quand vous faites cela.Remplacer
avec
De comprendre pourquoi cela pose un problème, vous avez besoin de savoir un peu comment Mockito œuvres, et aussi savoir dans quel ordre les instructions et expressions sont évaluées en Java.
Mockito ne peut pas lire dans votre code source, afin de comprendre ce que vous êtes pour lui demander de le faire, elle s'appuie beaucoup sur l'état statique. Lorsque vous appelez une méthode sur un objet fantaisie, Mockito enregistre les détails de l'appel dans une liste interne des invocations. Le
when
méthode lit le dernier de ces appels de la liste et les dossiers de cette invocation, dans leOngoingStubbing
objet auquel il renvoie.La ligne
causes suivantes interactions avec Mockito:
mainModel.getList()
est appelé,when
est appelé,thenReturn
est appelée sur leOngoingStubbing
objet retourné par lawhen
méthode.La
thenReturn
méthode peut ensuite demander à la maquette il a reçu via leOngoingStubbing
méthode pour gérer tout appel à lagetList
méthode pour retournersomeModelList
.En fait, comme Mockito ne peuvent pas voir votre code, vous pouvez également écrire vos moqueries comme suit:
Ce style est un peu moins évident à lire, d'autant plus que dans ce cas, le
null
doit être coulé, mais il génère la même séquence d'interactions avec Mockito et obtenir le même résultat que la ligne ci-dessus.Cependant, la ligne de
causes suivantes interactions avec Mockito:
mainModel.getList()
est appelé,when
est appelé,mock
deSomeModel
est créé (à l'intérieur degetSomeList()
),model.getName()
est appelé,À ce point Mockito devient confus. Il pensait que vous étiez moqueur
mainModel.getList()
, mais maintenant vous dites que vous voulez pour se moquer de lamodel.getName()
méthode. Pour Mockito, on dirait que vous êtes en train de faire les suivants:Cela semble idiot de
Mockito
comme il ne peut pas être sûr de ce que vous êtes en train de faire avecmainModel.getList()
.Noter que nous ne sommes pas à l'
thenReturn
appel de la méthode, comme la JVM doit évaluer les paramètres de cette méthode avant d'appeler la méthode. Dans ce cas, cela signifie que l'appel de lagetSomeList()
méthode.Généralement c'est une mauvaise conception de la décision de s'appuyer sur l'état statique, comme Mockito n', car il peut conduire à des cas où le Principe de moindre Étonnement est violé. Cependant, Mockito design de rendre claire et expressive, moqueries, même si elle conduit à l'étonnement, parfois.
Enfin, les versions récentes de Mockito ajouter une ligne supplémentaire pour le message d'erreur ci-dessus. Cette ligne supplémentaire indique que vous pouvez être dans la même situation que cette question: