Wpis z mikrobloga

#programowanie #java
Hej Cumple, uczę się pisać testy jednostkowe i mam pytanie, jak zweryfikować poprawnie czy obiekt został usunięty - w moim przypadku z dashboarda a nie z bazy danych. Usuwa na pewno bo w ramach sprawdzenia zmieniłem na chwilę metodę z void na listę obiektów i była pusta kiedy debugowałem. Nie wiem natomiast jak to poprawnie zapisać w metodzie testowej, do tej pory testowałem metody, które coś zwracały więc sobie radziłem. Kod: https://paste.ofcode.org/T5scExs8pgGdxkQV9zidD8
  • 12
@Dominias: times(1) to domyślne zachowanie. Ale poza tym, to ok.

Generalnie jest zasada, że powinieneś testować stan, a nie zachowania. Nie zawsze jest to jednak możliwe - jeśli masz tutaj jak sprawdzić, czy danego obiektu nie ma w bazie, to tak zrób, jeśli nie, to zostaw tak, jak kolega wyżej napisał (bez tego times).
@fegwegw: gdzie ta sprzeczność?

A interakcje z bazą oczywiście należy mockować, tylko w takim przypadku nie będzie możliwości, tak jak pisałeś, sprawdzać czy wpis znajduje się w bazie
@Dominias: źle, Ty w tym momencie testujesz framework:

activitiesServiceMock.addTrainingCycle(userId,getTrainingCycle(),LocalDate.now());
verify(activitiesServiceMock).addTrainingCycle(userId,getTrainingCycle(),LocalDate.now());

w drugiej linijce sprawdzasz to, co wywołałej w pierwszej.

A błąd masz pewnie dlatego, że now() zwraca Ci inne czasy.
@fegwegw: właśnie też myślałem, że to wina czasu bo wcześniej miałem w klasie TrainingCycle pole typu LocalDateTime, zmieniłem na LocalDate więc powinno się zgadzać bo to tylko dzień bez godzin bierze pod uwagę, błąd jest taki:

Argument(s) are different! Wanted:
activitiesServiceMock.addTrainingCycle(
"test",
pl.apka.model.gym.TrainingCycle@5a8e6209,
2018-05-25
);
-> at pl.apka.service.activity.service.ActivitiesServiceTest.addTrainingCycle(ActivitiesServiceTest.java:159)
Actual invocation has different arguments:
activitiesServiceMock.addTrainingCycle(
"test",
pl.apka.model.gym.TrainingCycle@4b4523f8,
2018-05-25
);
-> at pl.apka.service.activity.service.ActivitiesServiceTest.addTrainingCycle(ActivitiesServiceTest.java:158)
@Dominias:

Stwórz obiekt raz, i przekaż go do wywołania obu metod. Z tym, że to dalej nie będzie poprawny test, bo:

obiekt.wywołanieMetody()
verify(obiekt).wywołanieMetody()

to testowanie Mockito, a nie obiektu.
Ciężko bez zobaczenia całości kodu wskazać tutaj najlepszą metodę testowania - ja bym się skłaniał do sprawdzenia, czy do actualDay dodał się trening, i czy data się zwiększyła.