po pierwsze: Unitowy test ma testować jedną klasę
po drugie nie zaczynamy nazw metod z dużej literki ....
po trzecie, testujemy 1 funkcjonalność ZAWSZE w jednej metodzie tesetowej ... nie więcej
public User getUserById(Long userId) {
return userRepository.getOne(userId);
}
jest sens pisania testu, test musi sprawdzić czy metoda zwraca "usera" ... co jeśli go nie zwróci ?
Testy zawsze musimy pisać do metod/funkcjonalność którę coś nam zwracają np. jakiś rezultat lub "Zasób" w celu zabezpieczenia aplikacji przed możliwymi błędami w przyszłości kiedy nagromadzi się sporo kodu
public User registerUser(User user) {
if (!isUsernameAvailable(user.getUsername())) {
return user;
}
user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
UserRole role = new UserRole();
role.setRole(Roles.ROLE_USER.toString());
user.getRoles().add(role);
return userRepository.save(user);
}
private boolean isUsernameAvailable(String username) {
User user = userRepository.findByUsername(username);
if (user == null) {
return true;
}
return false;
}
Nie testujesz LOGIKI WEWNĘTRZNEJ METODY...
testujesz metode... ma zwrócić Usera, to testujesz na "Fake-owych" danych czy metoda zaleznie od wprowadzenia zamockowania przez ciebie danych faktycznie zwróci Ci Usera.... ( logika wewnętrzna Cię nie interesuje )
w drugim przypadku testujesz zależnie od podanego "STRING USERNAME" wartość prawdy/fałszu
okej ale dla takiego typu metod robimy dwa podejścia :
shouldReturnFalseForAvaiableUser () - testowanie przypadku false czyli mokujesz dane tak żeby uzyskać FALSE i takiego rezultatu się spodziewasz, analogicznie
shouldReturnTrueForAvaiableUser () testowanie przypadku TRUE czyli mokujesz dane tak żeby uzyskać TRUE i