我正在遵循我找到的Sping Boot 集成测试教程,它包含以下测试:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class EmployeeControllerIntegrationTest
{
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate rest;
@Test
public void test_Get_200() throws Exception
{
ResponseEntity<?> response = this.rest.getForEntity("http://localhost:" + port + "/employee", List.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
}
}
但是,我启用了Spring Security,因此此测试返回401而不是200。
如果它是相关的,这里是我的主应用程序的安全配置:
@Configuration
public class SecurityConfig
{
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception
{
http
.csrf().disable() // Do NOT do this in real life.
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
我没有任何特殊的测试配置文件。我使用的是H2内存数据库。
我尝试使用@WithMockUser或@WithAnonymousUser,但都不起作用(我仍然得到401)。我知道API本身可以工作,因为我已经手动测试过了。当手动登录并从http://localhost:8088/employee端点请求GET时,它工作得很好。因为某种原因,测试不起作用。
我错过了什么?
非常感谢您提前任何帮助!
2条答案
按热度按时间7ajki6be1#
ChatGPT来拯救并找到了解决方案。
事实证明,您必须在请求头中包含有效的用户名和密码,如下所示:
我只是加了这个
我的原始代码。
仅添加此内容后,测试顺利通过。
m3eecexj2#
我建议您在测试类中添加一些注解:
}
我已经在
@AutoConfigureMockMvc
中将addFilters
参数设置为false
,在类级别添加了@WebMvcTest(controllers = EmployeeController.class)
,最后在方法级别添加了@WithMockUser
注解,您提到您已经尝试过了。请将username
和/或password
替换为有效的(或角色,如果是这种情况)。希望有帮助!