• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

nullpointerexception w metodzie willReturn

Aruba Cloud - Virtual Private Server VPS
0 głosów
199 wizyt
pytanie zadane 14 października 2019 w Java przez heartagram Obywatel (1,770 p.)

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);
}

 

1 odpowiedź

+1 głos
odpowiedź 14 października 2019 przez mbabane Szeryf (79,260 p.)
wybrane 15 października 2019 przez heartagram
 
Najlepsza
 @Mock
 private UserService userService;

A klasa którą testujesz ma zależność do UserRepository. To UserRepository trzeba zamockować i wysterować.

komentarz 15 października 2019 przez heartagram Obywatel (1,770 p.)
aaaj faktycznie - dzięki :)

Podobne pytania

0 głosów
1 odpowiedź 1,194 wizyt
pytanie zadane 19 sierpnia 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 3 sierpnia 2018 w Java przez kamil159 Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 264 wizyt
pytanie zadane 8 lipca 2017 w Java przez Sidzej Użytkownik (850 p.)

93,332 zapytań

142,324 odpowiedzi

322,400 komentarzy

62,668 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...