klasa publiczna A { public void method (boolean b) { jeśli (b == prawda) metoda1 (); jeszcze metoda2 (); } private void method1 () {} private void method2 () {} }
public class TestA { @Test public void testMethod () { A a = mock (klasa A.); a. metoda (prawda); // jak testować jak verify (a) .method1 (); } }
Jak testować metodę prywatną jest wywoływana czy nie, a jak testować metodę prywatną używając mockito ???
Odpowiedzi:
Nie możesz tego zrobić z Mockito, ale możesz użyć Powermock, aby rozszerzyć Mockito i udawać metody prywatne. Powermock obsługuje Mockito. Oto przykład.
źródło
Niemożliwe przez mockito. Z ich wiki
źródło
Oto mały przykład, jak to zrobić z powermockiem
Aby przetestować metodę 1 użyj kodu:
Aby ustawić prywatny obiekt OBJ użyj tego:
źródło
Pomyśl o tym w kategoriach zachowania, a nie w kategoriach dostępnych metod. Wywołana metoda
method
ma określone zachowanie, jeślib
jest prawdziwe. Zachowuje się inaczej, jeślib
jest fałszywe. Oznacza to, że powinieneś napisać dwa różne testymethod
; po jednym w każdym przypadku. Więc zamiast trzech testów zorientowanych na metodę (jeden zamethod
, jeden zamethod1
, jeden zamethod2
, masz dwa testy zorientowane na zachowanie).Związane z tym (zasugerowałem to niedawno w innym wątku SO, iw rezultacie zostałem nazwany czteroliterowym słowem, więc możesz to wziąć z przymrużeniem oka); Uważam, że pomocne jest wybranie nazw testów, które odzwierciedlają zachowanie, które testuję, zamiast nazwy metody. Więc nie nazywaj swoje testy
testMethod()
,testMethod1()
,testMethod2()
i tak dalej. Lubię takie imionacalculatedPriceIsBasePricePlusTax()
lub,taxIsExcludedWhenExcludeIsTrue()
które wskazują, jakie zachowanie testuję; następnie w ramach każdej metody testowej testuj tylko wskazane zachowanie. Większość takich zachowań obejmuje tylko jedno wywołanie metody publicznej, ale może obejmować wiele wywołań metod prywatnych.Mam nadzieję że to pomoże.
źródło
Chociaż Mockito nie zapewnia takiej możliwości, ten sam wynik można osiągnąć za pomocą Mockito + klasy JUnit ReflectionUtils lub klasy Spring ReflectionTestUtils . Zobacz poniższy przykład zaczerpnięty stąd, wyjaśniający, jak wywołać metodę prywatną:
Pełne przykłady z ReflectionTestUtils i Mockito można znaleźć w książce Mockito na wiosnę
źródło
Nie powinieneś testować prywatnych metod. Należy przetestować tylko metody nieprywatne, ponieważ i tak powinny one wywoływać metody prywatne. Jeśli „chcesz” przetestować metody prywatne, może to oznaczać, że musisz przemyśleć swój projekt:
Czy używam odpowiedniego wstrzyknięcia zależności? Czy muszę przenieść metody prywatne do osobnej klasy i raczej to przetestować? Czy te metody muszą być prywatne? ... czy nie mogą być domyślne czy raczej chronione?
W powyższym przypadku dwie metody, które są nazywane „losowo”, mogą w rzeczywistości wymagać umieszczenia w osobnej klasie, przetestowania, a następnie wstrzyknięcia do klasy powyżej.
źródło
Korzystając z odbicia, można wywołać metody prywatne z klas testowych. W tym przypadku,
// metoda testowa będzie taka ...
Jeśli metoda prywatna wywoła jakąkolwiek inną metodę prywatną, musimy szpiegować obiekt i zablokować inną metodę. Klasa testowa będzie wyglądać następująco ...
// metoda testowa będzie taka ...
** Podejście polega na połączeniu refleksji i podglądania obiektu. ** metoda1 i ** metoda2 to metody prywatne, a metoda1 wywołuje metodę2.
źródło
Udało mi się przetestować prywatną metodę wewnątrz za pomocą mockito z wykorzystaniem refleksji. Oto przykład, próbowałem nazwać go tak, aby miał sens
źródło
Naprawdę nie rozumiem twojej potrzeby testowania metody prywatnej. Główny problem polega na tym, że twoja metoda publiczna ma void jako typ zwracany i dlatego nie możesz przetestować swojej metody publicznej. Dlatego jesteś zmuszony przetestować swoją prywatną metodę. Czy moje przypuszczenie jest prawidłowe?
Kilka możliwych rozwiązań (AFAIK):
Kpiąc ze swoich prywatnych metod, ale nadal nie będziesz „faktycznie” testować swoich metod.
Sprawdź stan obiektu używanego w metodzie. MOSTLY metody albo wykonują pewne przetwarzanie wartości wejściowych i zwracają dane wyjściowe, albo zmieniają stan obiektów. Można również zastosować testowanie obiektów pod kątem pożądanego stanu.
Zmień trochę kod (mam nadzieję, że nie jest to starszy kod). Moją podstawą pisania metody jest to, że zawsze należy coś zwracać (int / a boolean). Zwrócona wartość MOŻE lub NIE MOŻE zostać użyta przez implementację, ale PEWNIE BĘDZIE wykorzystana przez test
kod.
źródło
W rzeczywistości istnieje sposób na przetestowanie metod od prywatnego członka za pomocą Mockito. Powiedzmy, że masz taką klasę:
Jeśli chcesz, aby test
a.method
wywołał metodę zSomeOtherClass
, możesz napisać coś takiego jak poniżej.ReflectionTestUtils.setField();
zablokuje prywatnego członka czymś, co możesz szpiegować.źródło
Umieść test w tym samym pakiecie, ale w innym folderze źródłowym (src / main / java vs. src / test / java) i ustaw te metody jako pakiet-prywatny. Testowalność Imo jest ważniejsza niż prywatność.
źródło
W przypadkach, gdy metoda prywatna nie jest void, a wartość zwracana jest używana jako parametr metody zależności zewnętrznej, można mockować zależność i użyć znaku
ArgumentCaptor
do przechwycenia wartości zwracanej. Na przykład:źródło