Je suis en train d'écrire un test pour vérifier le comportement de ma classe lors de la réception de différentes réponses d'un service SOAP. J'utilise JAXB, donc ma réponse contient JaxbElements
, et pour beaucoup d'entre eux, je dois écrire une maquette, comme ça:Mockito mock objets à l'intérieur d'une méthode
JAXBElement<String> mock1 = mock(JAXBElement.class);
when(mock1.getValue()).thenReturn("a StringValue");
when(result.getSomeStringValue()).thenReturn(mock1);
JAXBElement<Integer> mock2 = mock(JAXBElement.class);
when(mock2.getValue()).thenReturn(new Integer(2));
when(result.getSomeIntValue()).thenReturn(mock2);
... <continue>
ce que je voudrais faire, est refactorize ce code de cette façon:
when(result.getSomeStringValue())
.thenReturn(mockWithValue(JAXBElement.class, "a StringValue");
when(result.getSomeIntValue())
.thenReturn(mockWithValue(JAXBElement.class, 2));
et définir une méthode:
private <T> JAXBElement<T> mockWithValue(Class<JAXBElement> jaxbElementClass, T value) {
JAXBElement<T> mock = mock(jaxbElementClass);
when(mock.getValue()).thenReturn(value);
return mock;
}
quand j'exécute le code avant tout le refactoring fonctionne correctement. Malheureusement, quand j'exécute le code après le refactoring, je reçois cette erreur:
org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
-> at com.mypackage.ResultConverterTest.shouldConvertASuccessfulResponseWithAllTheElements(ResultConverterTest.java:126)
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!
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed
où la ligne 126 est la première invocation de la méthode mockWithValue
. Donc, la question est: existe-t-il un moyen de réutiliser le même code afin de créer de nombreux simulacres avec un comportement similaire?
Depuis les classes générées JAXB sont DTO simples sans comportement des entreprises vous ne devriez pas les mocker ... –
Parce que les construire nécessite d'autres objets (nom Qname, classe declareType, portée de la classe, valeur T) et perd en lisibilité. De toute façon, je peux le faire, mais je suis tombé sur cette exception, et j'aimerais la comprendre. –
marco