@Riddle: co to znaczy mock-hell? Że brak testów integracyjnych? Mógłbyś rozwinąć?
To znaczy że Twoje testy praktycznie nic nie testują; że jest to znaczny przerost formy nad treścią; że 90% tego co tam jest to są setupy mocków, a może 10% to jest faktyczne testowanie czegokolwiek.
Np zobacz sobie na ten test:
@Test
void shouldReturnSavedDefaultProfileImage() {
// given
when(profileImageRepository.save(any(ProfileImage.class))).thenAnswer(i -> i.getArguments()[0]);
// when
ProfileImage returnedCreatedDefaultProfileImage = profileImageService.createDefaultProfileImage();
// then
verify(profileImageRepository, times(1)).save(argThat((ProfileImage savedProfileImage) -> {
Assertions.assertAll("Testing saved default profile image",
() -> assertNull(savedProfileImage.getId()),
() -> assertEquals(returnedCreatedDefaultProfileImage.getFileName(), savedProfileImage.getFileName()),
() -> assertEquals(returnedCreatedDefaultProfileImage.getFileType(), savedProfileImage.getFileType()),
() -> assertEquals(returnedCreatedDefaultProfileImage.getFileData(), savedProfileImage.getFileData())
);
return true;
}));
}
Jak dla mnie to ten test testuje praktycznie nic, i możnaby go wywalić bez absolutnie żadnej straty moim zdaniem.
Powinieneś oczywiście napisać test, sprawdzający czy da się stworzyć profil z domyślnym obrazkiem, ale na pewno nie w taki sposób. Już pomijam całkowicie, że ten test za dużo wie o implementacji (dużo za dużo), przez co refaktor kodu jest znacznie utrudniony. Potem będziesz chciał coś zmienić, i zobaczysz że Twoja zmiana powoduje fail połowy testów, i będziesz miał wybór - albo fixować testy, albo nie zrobić refaktoru - oba wyjścia są słabe, bo testy są słabe.