2014-12-11 11 views
19

Mam dość złożoną funkcję java, którą chcę przetestować przy użyciu jUnit i używam Mockito do tego celu. Funkcja ta wygląda mniej więcej tak:Zmodyfikuj parametr wejściowy funkcji pustej i przeczytaj ją potem.

public void myFunction (Object parameter){ 
    ... 
    doStuff(); 
    ... 
    convert(input,output); 
    ... 
    parameter.setInformationFrom(output); 
} 

Funkcja konwersji ustawia atrybuty wyjścia w zależności od wkładu i jest to funkcja typu void, chociaż parametr „wyjście” jest to, co jest wykorzystywane tak, jakby były to zwracane przez funkcjonować. Ta funkcja konwertowania jest tym, co chcę wykpić, ponieważ nie muszę polegać na danych wejściowych do testu, ale nie wiem, jak to zrobić, ponieważ nie znam się dobrze na Mockito.

Widziałem podstawowe przypadki jako when(something).thenReturn(somethingElse) lub metodę doAnswer, którą rozumiem jest podobna do poprzedniej, ale można do niej dodać więcej logiki, ale nie sądzę, aby te przypadki były odpowiednie dla mojej sprawy, ponieważ moja funkcja nie ma instrukcji return.

+0

A co chcesz makiety? Wyjście? – fge

+1

Mockito na bok, czy wiesz, że pisanie 'parameter = output;' nie zmieni wartości zmiennej, którą przekazujesz do tej metody? –

+0

@David Wallace, jeśli parametr jest "a", nazywam prawdziwą funkcję myFunction i parametr I print, a następnie parametr będzie na przykład "ab". Nie jest to dokładnie "parameter = output", właśnie napisałem, aby zrozumieć kod. Przepraszam za zamieszanie. – Juan

Odpowiedz

35

Jeśli chcesz, aby wyśmiewana metoda wywoływała metodę na (lub w inny sposób zmieniła) parametr, musisz napisać Odpowiedź jak w tym pytaniu ("How to mock a void return method affecting an object").

Od Kevin Welker „s answer tam:

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(); 
+0

Tego właśnie chcę, dzięki! – deFreitas

+1

można zmienić nową odpowiedź() na typ Void, a także zmienić typ odpowiedzi zwrotnej() na Void, aby uniknąć ostrzeżenia dotyczącego konstruktora. – Moz

+0

W szczególności wygląda to tak: nowa odpowiedź () { .... return (null); } – hubatish

Powiązane problemy