如何解决@WebMvcTest创建名称为'securityConfiguration'
我有一个Spring Boot Rest应用程序,我在其中使用JWT进行身份验证,并且在我刚启动该应用程序时可以正常工作。
我只想添加一些测试用例,但无法解决此问题(我使用mvn test
运行测试用例:
错误指出Spring无法创建userDetailsService bean,但这似乎是不正确的,因为我的应用程序可以正常运行。
不是:我试图通过@MockBean添加userdetailservice模拟。但是这次春天对于MyAuthenticationEntryPoint显示了相同的错误。我认为应该有一种解决方案,可以自动添加所有配置,或者避免对此端点全部使用。
[ERROR] verifyRegisterUserHttpRequest Time elapsed: 0.008 s <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'securityConfiguration': Unsatisfied dependency expressed
through field 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'com.myProjects.sample.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
- 这是测试班:
package com.myProjects.sample.controller;
@WebMvcTest(controllers = RegisterController.class)
public class RegisterControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private RegisterService registerService;
@MockBean
private ValidationService validationService;
// 1. Verifying Http Request Matching
@Test
public void verifyRegisterUserHttpRequest() throws Exception {
NewCustomerRequest requestBody = new NewCustomerRequest();
requestBody.setEmailAddress("sample@sample.com");
requestBody.setPhoneNumber("01112223344");
requestBody.setPassword("password");
requestBody.setPasswordVerify("password");
mockMvc.perform(post(MyWebUrls.API.API + MyWebUrls.Register.REGISTER_USER)
.content(objectMapper.writeValueAsString(requestBody))
.contentType("application/json"))
.andExpect(status().isOk());
}
}
- RegisterController和SecurityConfiguration
package com.myProjects.sample.controller;
@RestController
@RequestMapping(MyWebUrls.API.API)
public class RegisterController {
@Autowired
private RegisterService registerService;
@Autowired
private ValidationService validationService;
@PostMapping(MyWebUrls.Register.REGISTER_USER)
public ResponseEntity<?> registerUser(@Valid @RequestBody NewCustomerRequest newCustomerRequest,BindingResult bindingResult){
String validationResultMessage = validationService.getFirstValidationErrorMessage(bindingResult);
// ...
}
}
}
package com.myProjects.sample.security;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
// securedEnabled = true,// jsr250Enabled = true,prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private MyUserDetailsService userDetailsService;
@Autowired
private MyAuthenticationEntryPoint unauthorizedHandler;
@Autowired
private CustomAccessDeniedHandler accessDeniedHandler;
@Bean
public AuthTokenFilter authJwtTokenFilter(){
return new AuthTokenFilter();
}
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
// ....
- 另请参阅我的自定义详细信息服务类
package com.myProjects.sample.security;
@Service
public class MyUserDetailsService implements UserDetailsService {
@Override
@Transactional
public UserDetails loadUserByUsername(String emailOrMobilePhone) throws UsernameNotFoundException {
// ...
}
}
解决方法
可以将以下依赖项添加到项目中吗?
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
然后,这应确保还填充@WebMvcTest
的安全配置。
然后,在使用MockMvc
访问应用程序时,您可以使用多种技术来模拟凭据/用户:
@Test
@WithMockUser("duke")
或
@Test
public void testWithSecurityMockMvcRequestPostProcessors() throws Exception {
this.mockMvc
.perform(
post("/your/endpoint")
.with(jwt())
.with(csrf())
)
.andExpect(status().isOk());
}
here中提供了有关MockMvc
和Spring Security集成的更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。