Wpis z mikrobloga

Natrafiłem na pewien problem podczas testowania i choć go rozwiązałem to dalej nurtuje mnie ciekawość w jaki sposób brać na warsztat podobne sytuacje. Mianowicie, pisząc unit testy w #spring chciałem przetestować serwis, w którym metoda tworzy w sobie obiekt, coś ala klasę konfiguracyjną/wrapper, ale go nigdzie nie zwraca na zewnątrz.

classA
foo(){
Object x = new Object()
x.setSomething(...)

Jest jakiś pattern, żeby w unit testach sprawdzić poprawność wywołania takiej metody setSomething() z odpowiednimi wartościami?

Myślałem, żeby po prostu sprawdzić te argumenty z wykorzystaniem ArgumentCaptor, ale nie wiem w jaki sposób miałbym uchwycić taki obiekt. Nie jest on componentem, nie jest obiektem wsadowym, ani nie jest zwracany. Mówiąc wprost, w jaki sposób mam testować jednostkowo wywoływanie funkcji obiektów pomocniczych?

A teraz na przykładzie.

https://stackoverflow.com/questions/73808058/how-to-test-template-engine-while-styling-emails-with-junit-and-mockito-spring

Natrafiłem ten problem w dokładnie w tej samej klasie. Chodzi o obiekt MimeMessageHelper, który jest jakimś wrapperem MimeMessage z rozszerzonym interfejsem. Pisząc testy z automatu machnąłem mocka Mimemessage zwracanego z JavaMailSendera. Problem rozwiązałem sugerując się właśnie tym wątkiem tworząc obiekt Mimemessage, gdzie sprawdzam jego wartości grzebiąc w jego tablicach, ale co jeśli w przyszłości chciałbym przetestować czy jakieś funkcje w obiekcie pomocniczym się wywołują? W tym przypadku było to tylko ustawienie wartości kilku zmiennych, a nie dajmy na to jakiś invoke metody void, co normalnie bym testował na mocku metodą verify.

#java #programowanie #naukaprogramowania #programista15k
  • 6
w sumie może i racja, może nie potrzebnie tak ściśle sprawdzam czy serwis odpowiednio konfiguruje sobie inny serwis.


@mojemirabelki: Pod warunkiem, że tego skonfigurowanego właśnie serwisu używa ten sam obiekt, który konfigurował. Inaczej musisz testować side-effect.
@MQs: akurat sprawdzałem czy plik konfiguracyjny odpowiednio poustawiał wartości w obiekcie mimemessage niezbędnym do wysyłania maili. Tak zachodzę w głowę jak inaczej miałbym to kontrolować poza jakimiś testami integracyjnymi. Przy ewentualnej podmianie takiego pliku co najwyżej wywali mi wyjątek lub testy, ale nie będzie sypać błędami.

W tym przypadku to widocznie moja nieuwaga, bo nie powinienem mockować takiego obiektu, a raczej sprawdzać czy taki wrapper go odpowiednio skonfigurował, co koniec końców