Wpis z mikrobloga

@Cheessys: są w miarę poprawne, natomiast logika biznesowa jest pokrętna.

I aby testy były czytelniejsze, możesz użyć biblioteki Truth do asercji, są dużo lepsze niż teg junitowe.
@Cheessys: wydaje mi się, że model jest zbyt rozbudowany jak dla tego typu funkcjonalności. Z tego co widzę, chcesz up i down voteować artykuły. Po co tworzyć osobny obiekt Vote? Myślę, że mapa user-wartość głosu w modelu Article w zupełności wystarczy.

Czym w tym serwisie jest w ogóle 'Activity'? Czemu VoteType jest enumem, a i tak do porównywania wartości używasz stringów?
@fegwegw: Po Activity dziedziczą 4 inne klasy w których można glosować, każda ma tez klase dziedzicząca po Vote i zapisuje w db na co użytkownik glosował, a porównuje stringi bo w db voteType jest zapisany stringiem
@Cheessys: Trzymaj się koknwencji "given (or setup) when(or execute) then(or verify)"
Co do kodu, to po co Ci serwis mutujący obiekty, gdzie one same mogą to robić - Activity.vote(vote)

Po Activity dziedziczą 4 inne klasy w których można glosować

chciałeś napisać implementują interfejs Activity?
Co do kodu, to po co Ci serwis mutujący obiekty, gdzie one same mogą to robić - Activity.vote(vote)


Zeby nie powtarzac tego w 4 klasach

chciałeś napisać implementują interfejs Activity?


nie
@cypo:
Albo Vote oddzielnie (z jakąś relacją do Activity), albo interfejs Voteable do tych 4 klas z metodą vote(voteCommand) i w środku obiekt typu Vote, żeby się nie powtarzać z kodem głosującym.
Ja bym to rozdzielił - jest np (teoretycznie). Activity: artykuł, komentarz. To są oddzielne odpowiedzialności. Głosowanie może być na wybrany obiekt, więc vote = voteRepository.for(activity) a potem vote.apply(voteCommand). Wtedy głosowanie nie rusza obiektu treści, który jest już utrwalony i nie musi
@Cheessys: Jeśli jednak nie masz czasu ogarniać wszystkiego obiektowo, domenowo i chcesz pisać w starym warstowo-proceduralnym stylu, to niech chociaż serwis nie mutuje argumentów. Powinien ogarnąć wszystko na raz - pobranie, modyfikację i zapis. Wtedy zamiast bazy w testach - mockito na DAO (czy tam repository) i szpiegujesz obiekt Activity, czy przy zapisie do bazy ma poprawne wartości.

W sumie doczytując testy da się chyba ogarnąć use-case jaki masz. Spojrzę
@Cheessys:
Odnośnie tematu testów, pomijając powyższe dywagacje.
void addVoteUp() zmieniony:

@Test
addVote_shouldVoteUp() { // co testujemy, jaki jest cel testu
//given // podział na bloki: ustawienie stanu, uruchomienie akcji, weryfikacja wyników/stanu końcowego
vote.setVoteType(VoteType.VOTE_UP.toString());
//when
Activity result = voteService.addVote(article, vote);
//then
Assert.assertEquals(1, result.getVotes());
}