2012-10-31 4 views
11

Testuję metodę void, która wywołuje kilka innych metod void w klasie (wszystkie te metody są w tej samej klasie). Metoda jest coś wzdłuż tych linii ...Jak zignorować kilka wywołań metod void w metodzie void w Mockito

public void methodToTest() { 
    methodA(); 
    methodB(); 
} 

void methodA() { 
    methodA1(); 
    methodA2(); 
    methodA3(); 
} 

Co chciałbym zrobić to spowodować methodA() powyżej, aby nic nie robić. Oznacza to, że chcę methodA() w zasadzie być tak:

void methodA() { } 

Próbowałem zarówno doThrow() i doAnswer() na methodA() bezskutecznie. To tak, jakby obaj byli całkowicie ignorowani.

Przykładem co próbowałem ...

doThrow(new RuntimeException()).when(mockedClass).methodA(); 

Czy istnieje sposób, aby to zrobić tylko za pomocą Mockito? Nie jestem uprawniony do zmiany klasy, która jest modyfikowana.

+1

To powinno zadziałać, czy na pewno "metodaA" nie jest "ostateczna"? – Brice

+0

'methodA' nie jest" ostateczna " –

+1

patrząc wstecz na twój fragment wygląda tak, jakbyś chciał wykonać częściową symulację, może tylko wykonując' methodB', podczas gdy wykonujesz 'methodA'. Z całą pewnością używasz 'mock (YourObject.class)', wtedy oczywiście nie robi nic, a na pewno nigdy nie wykonasz prawdziwego kodu. Możesz osiągnąć to, co chcesz "szpiegować (YourObject.class)", to domyślnie wykona prawdziwy kod. Jednak częściowe makiety są uznawane za zapachy testowe, jeśli nie są zapachem projektowym, powinieneś poszukać okazji do tego, aby zachowanie 'methodA' było zależnością, którą możesz na przykład wyeksponować w swoim API jako' AStrategy'. – Brice

Odpowiedz

18

Jeśli chcesz, aby metoda B była nadal wykonywana, podczas gdy metodaA nie robi nic. W tym celu:

TestClass spy = spy(new TestClass()); 
doNothing().when(spy).methodA(); 
spy.methodToTest(); 
+0

Nie wspominałem o tym powyżej, ale faktycznie używam szpiega, jak podano w twoim przykładzie. Próbowałem ten dokładny kod w mojej klasie, a wewnętrzne metody methodA() są nadal wykonywane, co jest tym, czego staram się uniknąć ... –

+1

używasz odwróconej notacji 'doNothing(). When()' jak wyżej, czy używasz notacji 'when(). thenReturn()'? Ta ostatnia forma faktycznie wywołuje rzeczywistą metodę na Szpiegu, gdy wywoływana jest linia 'gdy' (to znaczy, gdy zmienia się alternatywne zachowanie częściowej sztuczki), co może powodować problemy. Stąd potrzeba użycia poprzedniej notacji "do niczego" dla szpiegów, aby uniknąć tego problemu. –

+0

@KevinWelker - Używam 'doNothing(). When()' –