poniedziałek, 4 stycznia 2021

ArgumentCaptor to the rescue

 Wczoraj po raz pierwszy użyłem klasy ArgumentCaptor z pakietu Mockito i jestem pod wielkim wrażeniem jak prosto i elegancko jest to napisane.

Zadanie jest następujące – testujemy klasę implementującą interface Evaluator, która posiada metodę setFitness(Gene).

setFitness odczytuje wartość pola Gene.value, jest to wartość liczbowa zakodowana jako char. Następnie porównujemy ją z analogiczną wartością, zakodowaną w klasie Evaluator i po zastosowaniu odpowiedniego algorytmu otrzymujemy liczbę float w przedziale 0-1, opisującą trafność dopasowania. Im bliżej 1, tym dopasowanie jest dokładniejsze; w przypadku pełnej zgodności otrzymujemy wynik 1.

Następnie nasze dopasowanie zapisujemy za pomocą metody Gene.setFitness, zmieniając stan obiektu. Ponieważ testujemy klasę Evaluator, Gene będzie mockowany. I tutaj pojawia się problem – zmieniamy stan mocka, który nie jest zapamiętywany – w końcu mock podaje nam wszystko, co chcemy, dzięki komendzie:

when(gene.getValue()).thenReturn(evaluatedValue);
I tutaj pojawia się ArgumentCaptor, który przechwyci jaką wartość podajemy mockowi. Deklarujemy go jako pole klasy testowej:
ArgumentCaptor<Float> floatArgumentCaptor = ArgumentCaptor.forClass(Float.class);
Przy deklaracji określamy jaki typ zmiennej będzie przechwytywany. W tym przypadku chcę złapać prymitywny typ float, więc używam odpowiedniego Wrappera.
verify(gene).setFitness(floatArgumentCaptor.capture());
W końcu po wywołaniu metody na mojej klasie Evaluator dodaję powyższą linię – verify obserwuje zachowanie mocka i kiedy odwołamy się do jego settera, floatArgumentCaptor.capture() wykona swoją robotę.
Kolejność wywołania jest ważna – najpierw wykonujemy operację na mocku, a później używamy verify, w innym przypadku metoda nie zadziała poprawnie. Nie do końca rozumiem dlaczego, ale przetestowałem, że to jest właściwy sposób używania.
Teraz floatArgumentCaptor posiada zapisaną wartość float, którą mogę wrzucić do asercji za pomocą floatArgumentCaptor.getValue() i sprawdzić czy została wyliczona zgodnie z założeniami.

Brak komentarzy:

Prześlij komentarz

Server socket all over place

 Kilka godzin tutoriali YT później i różnych prób, w końcu udało się zachęcić Server do współpracy :) Nie mogę powiedzieć, że to przełom, bo...