2017-09-26 3 views
2

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?

+0

Depuis les classes générées JAXB sont DTO simples sans comportement des entreprises vous ne devriez pas les mocker ... –

+0

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

Répondre

1

Vous ne devriez pas vous moquer tout en créant une réponse.

Laissez-moi vous expliquer, dans ce code

private <T> JAXBElement<T> mockWithValue(Class<JAXBElement> jaxbElementClass, T value) { 
    JAXBElement<T> mock = mock(jaxbElementClass); 
    when(mock.getValue()).thenReturn(value); 
    return mock; 
} 

vous moquez JAXBElement<T> mock = mock(jaxbElementClass) et vous utilisez cette méthode complète en réponse return.

Vous devez d'abord créer ces réponses séparément, puis les utiliser à l'intérieur de return.

String stringResponse=mockWithValue(JAXBElement.class, "a StringValue"); 
when(result.getSomeStringValue()).thenReturn(stringResponse); 

Essayez ceci, cela va fonctionner.

+1

Je ne comprends toujours pas pourquoi, mais oui, ça marche! Je vous remercie! – marco

+0

Voir aussi l'indice # 3 3: vous êtes en train d'écraser le comportement d'un autre simulacre à l'intérieur avant l'instruction 'thenReturn' si complété –

2

En ce qui concerne une certaine implication des génériques supplémentaires se moquant, il est préférable d'opter pour la syntaxe doReturn()..when():

doReturn(mockWithValue(JAXBElement.class, "a StringValue")) 
     .when(result).getSomeStringValue(); 

    doReturn(mockWithValue(JAXBElement.class, 2)) 
     .when(result).getSomeIntegerValue(); 

et

private <T> JAXBElement<T> mockWithValue(Class<JAXBElement> jaxbElementClass, T value) { 
     JAXBElement<T> mock = mock(jaxbElementClass); 
     doReturn(value).when(mock).getValue(); 
     return mock; 
    } 
+0

c'est exactement ce que je cherchais, merci! – marco