Я пытаюсь написать интеграционный тест для аутентификации с помощью Spring Security и JWT. Моя проблема в том, что во время аутентификации в фильтре аутентификации он проверяет, действителен ли пользователь во внешней системе. Как я могу имитировать класс, который обращается к внешней системе во время теста?
Вот конфигурация безопасности:
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final AuthService authService;
public WebSecurityConfig(AuthService authService) {
this.authService = authService;
}
@Bean
public AuthentificationTokenFilter authenticationTokenFilter() {
return new AuthentificationTokenFilter(authService);
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
}
}
Мне нужно имитировать AuthService внутри AuthentificationTokenFilter, где происходит фактическая аутентификация, но я напрямую не взаимодействую с ним и конфигурацией безопасности. Я только пытаюсь сделать запрос на отдых для RestController, и если аутентификация верна, этот запрос должен вернуть код 200.




Вам действительно нужно издеваться над этим с помощью Mockito? Используйте преимущество Пружинные профили и аннотации @Profile, чтобы различать реализацию интерфейса AuthService для test и других сред.
@Service
@Profile("test")
public class MockAuthService implements AuthService {
// ... the mock implementation
}
У него есть только один метод, который возвращает true или false, поэтому я подумал, что имитировать это будет проще, но, делая это с профилями, будет легче добавлять его в каждый тест.
@ user2452483: Да, с помощью этого подхода вы можете контролировать больше реализаций (в отношении данных в памяти, в отношении базы данных разработчиков или другой ...). Я считаю, что этот способ легче тестировать, и в основном вы сосредотачиваетесь на самом тестировании, чем на насмешках.