Je reçois l'exception suivante lors de l'exécution des tests. J'utilise Mockito pour me moquer. Les conseils mentionnés par la bibliothèque Mockito n'aident pas.
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 de DomainTestFactory
. Lorsque j'exécute 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;
}
}
Réponses:
Vous vous moquez de vous moquer. Vous appelez
getSomeList()
, ce qui fait des moqueries, avant d'avoir fini de vous moquerMyMainModel
. Mockito n'aime pas ça quand vous faites ça.Remplacer
avec
Pour comprendre pourquoi cela pose problème, vous devez en savoir un peu plus sur le fonctionnement de Mockito, et également savoir dans quel ordre les expressions et les instructions sont évaluées en Java.
Mockito ne peut pas lire votre code source, donc pour comprendre ce que vous lui demandez de faire, il repose beaucoup sur l'état statique. Lorsque vous appelez une méthode sur un objet fictif, Mockito enregistre les détails de l'appel dans une liste interne d'appels. La
when
méthode lit le dernier de ces appels dans la liste et enregistre cet appel dans l'OngoingStubbing
objet qu'elle renvoie.La ligne
provoque les interactions suivantes avec Mockito:
mainModel.getList()
est appelée,when
est appelée,thenReturn
est appelée sur l'OngoingStubbing
objet retourné par lawhen
méthode.La
thenReturn
méthode peut ensuite demander au simulacre qu'elle a reçu via laOngoingStubbing
méthode de gérer tout appel approprié à lagetList
méthode à renvoyersomeModelList
.En fait, comme Mockito ne peut pas voir votre code, vous pouvez également écrire votre moquerie comme suit:
Ce style est un peu moins clair à lire, d'autant plus que dans ce cas le
null
doit être casté, mais il génère la même séquence d'interactions avec Mockito et obtiendra le même résultat que la ligne ci-dessus.Cependant, la ligne
provoque les interactions suivantes avec Mockito:
mainModel.getList()
est appelée,when
est appelée,mock
deSomeModel
est créé (à l'intérieurgetSomeList()
),model.getName()
est appelée,À ce stade, Mockito est confus. Il pensait que vous vous moquiez
mainModel.getList()
, mais maintenant vous lui dites que vous voulez vous moquer de lamodel.getName()
méthode. Pour Mockito, il semble que vous faites ce qui suit:Cela semble idiot
Mockito
car il ne peut pas être sûr de ce que vous faitesmainModel.getList()
.Notez que nous ne sommes pas parvenus à l'
thenReturn
appel de méthode, car la machine virtuelle Java doit évaluer les paramètres de cette méthode avant de pouvoir appeler la méthode. Dans ce cas, cela signifie appeler lagetSomeList()
méthode.En général, c'est une mauvaise décision de conception de s'appuyer sur un état statique, comme le fait Mockito, car cela peut conduire à des cas où le principe du moindre étonnement est violé. Cependant, le design de Mockito permet une moquerie claire et expressive, même si cela conduit parfois à l'étonnement.
Enfin, les versions récentes de Mockito ajoutent une ligne supplémentaire au message d'erreur ci-dessus. Cette ligne supplémentaire indique que vous êtes peut-être dans la même situation que cette question:
la source
Pour vous moquer des méthodes d'annulation, essayez ci-dessous:
la source