Witam,
j/w. Wszystko wygląda dobrze, a jednak nie wiem czemu dostaje NPE w tym miejscu:
given(userService.getUserRepository().findByUsername("user1")).willReturn(user);
Zaczynam dopiero przygodę z testami więc pewnie jeszcze 'czegoś' nie wiem :)
Klasa testowa:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.security.core.userdetails.UserDetails;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
@ExtendWith(MockitoExtension.class)
public class CustomUserDetailsServiceTest {
@Mock
private UserService userService;
@InjectMocks
private CustomUserDetailsService customUserDetailsService;
@Test
public void loadUserByUsernameShoulReturnCorrectUser() {
// given
User user = new User("user1", "password1");
given(userService.getUserRepository().findByUsername("user1")).willReturn(user);
// when
UserDetails userToReturn = customUserDetailsService.loadUserByUsername("user1");
// then
assertThat(userToReturn.equals(user));
}
klasa UserService:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private static final String DEFAULT_ROLE = "ROLE_USER";
private UserRepository userRepository;
private UserRoleRepository roleRepository;
private PasswordEncoder passwordEncoder;
@Autowired
public UserService(UserRepository userRepository, UserRoleRepository roleRepository,
PasswordEncoder passwordEncoder) {
super();
this.userRepository = userRepository;
this.roleRepository = roleRepository;
this.passwordEncoder = passwordEncoder;
}
public void addWithDefaultRole(User user) {
UserRole defaultRole = roleRepository.findByRole(DEFAULT_ROLE);
user.getRoles().add(defaultRole);
String passwordHash = passwordEncoder.encode(user.getPassword());
user.setPassword(passwordHash);
userRepository.save(user);
}
public UserRepository getUserRepository() {
return userRepository;
}
}
Klasa CustomUserDetailsService:
import java.util.HashSet;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class CustomUserDetailsService implements UserDetailsService {
private UserRepository userRepository;
@Autowired
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null)
throw new UsernameNotFoundException("User not found");
org.springframework.security.core.userdetails.User userDetails = new org.springframework.security.core.userdetails.User(
user.getUsername(), user.getPassword(), convertAuthorities(user.getRoles()));
return userDetails;
}
private Set<GrantedAuthority> convertAuthorities(Set<UserRole> userRoles) {
Set<GrantedAuthority> authorities = new HashSet<>();
for (UserRole ur : userRoles) {
authorities.add(new SimpleGrantedAuthority(ur.getRole()));
}
return authorities;
}
}
Interfejs UserRepository:
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}