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

nullpointerexception w metodzie willReturn

VPS Starter Arubacloud
0 głosów
157 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,280 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ź 492 wizyt
pytanie zadane 19 sierpnia 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 140 wizyt
pytanie zadane 3 sierpnia 2018 w Java przez kamil159 Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 214 wizyt
pytanie zadane 8 lipca 2017 w Java przez Sidzej Użytkownik (850 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...