在通过postman进行的api测试中,api工作正常,但是在通过mockmvc进行的测试中,出现了404错误。
我的控制器类
@RestController
@RequestMapping("/login")
@EnableWebMvc
public class UserController {
@GetMapping("/hi")
public ResponseEntity<String> hi(){
return new ResponseEntity<>("hi", HttpStatus.OK);
}
}
我的安全配置
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.headers()
.addHeaderWriter(new XFrameOptionsHeaderWriter(
XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
.and()
.authorizeHttpRequests(authorize -> authorize
.anyRequest().permitAll())
;
return http.build();
}
我的测试类
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = SecurityConfig.class)
@WebAppConfiguration
@WebMvcTest(UserController.class)
class UserControllerTest {
@Test
@DisplayName("Get check")
void getCheck() throws Exception {
mockMvc.perform(get("/login/hi"))
.andDo(print())
.andExpect(status().isOk());
}
}
我该怎么办?
即使是Spirng安全的文件也不正确。
1条答案
按热度按时间yebdmbv41#
你正在使用一个所谓的“Sping Boot Test Slice”(
@WebMvcTest
),它只配置与Web层相关的所有内容。这很好。这个Slice将找到你的控制器,也会拾取你的安全配置。但是,您添加了
@ContextConfiguration
。{@code @ContextConfiguration}定义了类级别的元数据,用于确定如何为集成测试加载和配置{@link org.springframework.context. ApplicationContext}。
这样,您就有效地禁用了
UserController
的自动发现,而您只得到了安全配置。MockMVC可能会向您显示一个404错误。如何修复这个问题?只要删除它:)但是当你这样做的时候,你的自定义Spring Security配置在测试过程中也会消失。
要解决此问题,您有两个选项:您可以在切片上导入其他配置类,如下所示:
或执行如下完整集成测试:
后者将调出所有内容(除了嵌入式服务器,但这也可以做到)。
正如您最初要求的切片,这里是我的建议(注意,您不需要扩展名,也不需要配置的技巧):
我向控制器添加了第二个方法,并稍微更改了安全配置,以明确如何 * 使用 * 模拟用户进行测试:
以及控制器:
还请注意,您真的不应该将
@Configuration
放在实际实现您的业务的类上,请将它们分开(我指的是将@EnableWebMvc
添加到控制器中......此外,无论如何,对于Sping Boot Web MVC启动器,注解本身是多余的)。完整的
pom.xml
也可供参考: