Я создал простой сервис Rest Api с использованием весенней загрузки 2.2.5. ПОЖАЛУЙСТА, я только что включил Spring Security в приложении. Юниты не работают. Я попробовал некоторые способы решения этой проблемы, но она не работает.
Просматривая ссылки в книгах и в Интернете (включая вопросы, на которые дан ответ в переполнении стека), я узнал о двух способах отключения безопасности. в тестах:
- @ WebMvcTest (значение = MyController.class, secure = false)
- @ AutoConfigureMock Mvc (secure = false)
- @EnableAutoConfiguration (exclude = {SecurityAutoConfiguration.class})
Все эти аннотации я пробовал один за другим в классе Test, но он не работает.
1. @ WebMvcTest (value = MyController) .class, secure = false)
2. @ AutoConfigureMock Mvc (secure = false)
Оба эти параметра были определены в различных ответах переполнения стека как устаревшие, но я попробовал их в любом случае.
К сожалению, они не работали. По-видимому, в версии 2.2.1 Spring Boot (используемой мной версии) безопасность не просто устарела, она исчезла. Тесты с аннотациями с использованием параметра «secure = false» не компилируются. Фрагмент кода выглядит следующим образом:
Code Snippet
package com.akarsh.controller;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})
@SpringBootTest(classes = SpringBootProj2Application.class,webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SurveyControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private SurveyService surveyService;
@Test
public void retrieveDetailsForQuestion_Test() throws Exception {
Question mockQuestion = new Question("Question1",
"Largest Country in the World", "Russia", Arrays.asList(
"India", "Russia", "United States", "China"));
Mockito.when(
surveyService.retrieveQuestion(Mockito.anyString(), Mockito
.anyString())).thenReturn(mockQuestion);
RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
"/surveys/Survey1/questions/Question1").accept(
MediaType.APPLICATION_JSON);
MvcResult result = mockMvc.perform(requestBuilder).andReturn();
String expected = "{\"id\":\"Question1\",\"description\":\"Largest Country in the World\",\"correctAnswer\":\"Russia\",\"options\":[\"India\",\"Russia\",\"United States\",\"China\"]}";
String actual=result.getResponse().getContentAsString();
JSONAssert.assertEquals(expected,actual , false);
}
\\
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// Authentication : User-->Roles
// Authorization : Role->Access
@Autowired
public void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}secret").roles("USER")
.and()
.withUser("akarsh").password("{noop}ankit").roles("ADMIN","USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic()
.and().authorizeRequests()
.antMatchers("/surveys/**").hasRole("USER")
.antMatchers("/users/**").hasRole("USER")
.antMatchers("/**").hasRole("ADMIN")
.and().csrf().disable()
.headers().frameOptions().disable();
}
}
\ Получение следующего исключения
Description:
A component required a bean of type 'org.springframework.security.config.annotation.ObjectPostProcessor' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.security.config.annotation.ObjectPostProcessor' in your configuration.
2020-04-13 14:51:15.659 ERROR 5128 --- [ main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@36902638] to prepare test instance [com.akarsh.controller.SurveyControllerTest@3eb8057c]
\\
@RestController
public class SurveyController {
@Autowired
SurveyService surveyService;
@GetMapping("/surveys/{surveyId}/questions")
public List<Question> retrieveQuestionForSrvey(@PathVariable String surveyId)
{
if(surveyId!=null)
{
return surveyService.retrieveQuestions(surveyId);
}
return null;
}
@GetMapping("/surveys/{surveyId}/questions/{questionId}")
public Question retrieveQuestion(@PathVariable String surveyId,@PathVariable String questionId)
{
if(surveyId!=null)
{
return surveyService.retrieveQuestion(surveyId, questionId);
}
return null;
}
@PostMapping("/surveys/{surveyId}/questions")
public ResponseEntity<?> addQuestionForSrvey(@PathVariable String surveyId, @RequestBody Question question) {
Question createdTodo = surveyService.addQuestion(surveyId, question);
if (createdTodo == null) {
return ResponseEntity.noContent().build();
}
URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
.buildAndExpand(createdTodo.getId()).toUri();
return ResponseEntity.created(location).build();
}