Если вы создадите экземпляр UserDetailsServiceImpl
самостоятельно и не позволите Spring сделать это - ничего не будет введено. Это то, что вы делаете в методе @BeforeAll
, потому что вы используете инъекцию на основе поля, но вы этого не видите.
Если вы хотите продолжать использовать этот метод инъекции, вам нужно разрешить впрыск пружины в тесте. UserDetailsServiceImpl
.
. Для этого вам нужно добавить @SpringBootTest
к вашему тестовому классу:
@SpringBootTest
class UserDetailsServiceImplTest {
@Autowired
private UserDetailsServiceImpl userDetailsServiceImpl;
}
Но, похоже, вы хотите насмехаться над UserRespository (и для модульного тестирования это лучший выбор) чтобы сделать это, самое простое и понятное ожидание, чтобы это сделать, это обновить информацию о том, как вы внедряете и используете инжектор конструктора (подробнее об этом в документации )
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private final UserRepository userRepository;
public UserDetailsServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository
}
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Optional<User> user = userRepository.findByEmail(email);
user.orElseThrow(() -> new UsernameNotFoundException("Not found: " + email));
return user.map(UserDetailsImpl::new).get();
}
}
и измените ваш тест, как простой модульный тест:
class UserDetailsServiceImplTest {
private UserDetailsServiceImpl userDetailsServiceImpl;
private UserRepository userRepository;
@BeforeEach
void setup() {
userRepository = mock(UserRepository.class)
userDetailsServiceImpl = new UserDetailsServiceImpl(userRepository);
}
@Test
void testLoadUserByUsername() {
mockedUser = mock(User.class);
Optional<User> user = Optional.of(mockedUser);
when(userRepository.findByEmail(email)).thenReturn(user);
assertEquals(userRepository.findByEmail(email), user);
UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email);
assertTrue(userDetails instanceof UserDetails);
}
}
Точно так же, как @bhdrkn предложил вам прочитать больше о каркасе и внедрении зависимостей в целом. А также о модульном тестировании.