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
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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?
  • Odpowiedz
@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 wywołana metoda marschal() to ma zostać rzucony wyjątek
  • Odpowiedz
@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),
  • Odpowiedz
@Godziu73: szkoda że go nie rozumiem :/
@interface: bardzo descriptive nazwa, co to jest d--a? :P

klamry {} zastąpią podane później po przecinkach wartości w kolejności w jakiej zostały podane.


nie czaję. gdzie te wartości będą podawane? O_o
  • Odpowiedz
@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
  • Odpowiedz
@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 w celach
  • Odpowiedz
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ć
  • Odpowiedz
@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,
  • Odpowiedz