Wpis z mikrobloga

#java #programowanie

Ma ktoś pomysł jak przetestować wyrzucanie tego wyjątku?
AirborneStatus ma 2 pola, jedno jest stringiem a drugie booleanem, nie ma opcji żeby podać złe dane - o ile nie ma błędu w oprogramowaniu, wiadomość zawsze utworzy się dobra, a wtedy też dobrze się zaszyfruje do XMLa...

Chciałabym uniknąć używania PowerMocka (obie metody są statyczne, klasy Utils...), bo słyszałam że to świadczy o złym designie... W takim razie jak przeształcić ten kod żeby był dobry i testowalny?
Myślę nad tym i myślę i nie wiem jak to wymyślić ( ͡° ͜ʖ ͡°)
noelo_cohelo - #java #programowanie

Ma ktoś pomysł jak przetestować wyrzucanie teg...

źródło: comment_bYAK9xI0Ld38sBGft3HzKsJkt06WJSAg.jpg

Pobierz
  • 28
@nfan: nie zawołałeś...
mógłbyś mi to wyjaśnić bardziej merytorycznie? ten kod w 85% składa się z mojego przerobionego + np new JAXBException()nie zrobię bo nie ma takiej metody. topicAirborneStatusto też nie jest metoda, spyto jak rozumiem to metoda z Mockito ale nie ma nawet nawiasów... to jakiś trolling?
@noelo_cohelo bo to tylko podpowiedź, a nie działający kod, ale od początku

1. statyczne wywołania metod na utilach zamykasz w metodach testowanej klasy, dzięki temu masz możliwość symulowania co te metody zwracają bez używania PowerMocka (pierwsze dwie metody w kodzie, który przysłałem)
2. w testach jednostkowch obiekt klasy, która posiada te metody robisz jako spy
3. określasz, że gdy na obiekcie stworzonym w punkcie 2 (w przykładzie nazwałem go spy) zostanie
@nfan: super, dzięki!
1. głupio wyglądają te pierwsze dwie metody ;) ale może tak trzeba.
2. no właśnie tego mi brakowało - co to ten spy ;)
4. tego to już nie rozumiem. jakie powiadomienie i co masz na myśli przez .topicAirborneStatus(...)?
5. nie pisałam że nie ma żadnego tylko takiego bez parametrów

Gdzieś tam wyszperałam też i wymyśliłam że mogłabym te metody zrobić niestatyczne (w sumie to moja klasa), zamiast
@noelo_cohelo
4. a widzisz, zamieszałem. Żle popatrzyłem i byłem pewien, że topicAirborneStatus to metoda w klasie, którą testujesz, a w rzeczywistości to jest obiekt jakiejś innej klasy z metodą publish. W takim razie musisz zrobić mock'a dla topicAirborneStatus i na nim zrobić verify, składniowo podobnie do tego co wrzuciłem :)

Możesz tak zrobić, tylko wtedy żeby to było fajnie testowalne to musiałabyś instancję XmlHelper np. wrzucać jako argument do konsruktora
@noelo_cohelo: Nie wiem co to jest ten cały AirbornService, ale jak masz problem z testowaniem, to często jest to problem z dizjanem.

Twoim problemem jest ścisłe przywiązanie do obcego kodu (tight coupling).

Po pierwsze, komunikujesz się z zewnętrzną usługą statycznie – jest to wyraźne naruszenie zasady odwracania zależności (dependency inversion principle). Powinieneś dostawać obiekt tej usługi w konstruktorze – wtedy nie miałbyś problemu z jego podmianą (na inaczej skonfigurowany egzemplarz, np
jak masz problem z testowaniem, to często jest to problem z dizjanem.


@MacDada: mnóstwo razy to słyszałam, tylko nigdy nie wiem jak zrobić dobry dizajn ( ͡° ͜ʖ ͡°)
co to jest zewnętrzna usługa? XmlUtils to moja klasa.

a problem w ogóle nie dotyczy logera tylko samego wyrzucania wyjątku - nie wiem jak to zasymulować
mnóstwo razy to słyszałam, tylko nigdy nie wiem jak zrobić dobry dizajn ( ͡° ͜ʖ ͡°)


@noelo_cohelo: https://en.wikipedia.org/wiki/SOLID_(object-oriented_design) + czytaj wszystko od Wujka Boba

co to jest zewnętrzna usługa?


@noelo_cohelo: „Nie Twój kod” / kod z innej części appki, który chcesz odizolować / kod niższego poziomu.

XmlUtils to moja klasa


@noelo_cohelo: No ale jeśli to usługa, to rób normalne metody i wstrzykuj, a nie jakieś
@MacDada: marshal.

Potraktować test funkcjonalnie i przekazać taki message, żeby to wybuchło (zauważ, że samo message możesz zmockować)

Myślałam o tym, wtedy wybuchnie na createFlightStatusMessage i też nie będzie to JAXBException.

Potraktować test jednostkowo i zmockować usługę tak, żeby wybuchała.

No właśnie, tylko staticów nie zmockuję ;>

Przyjmuj instancję w konstruktorze

Co jeśli nie mogę tego zrobić? Obecnie system jest tak zbudowany że konstruktor jest dziedziczony.