401中的Spring Boot集成测试结果

时间:2016-08-23 18:57:13

标签: spring-boot

我们有一个Spring Boot 1.4 Web应用程序暴露了一个REST api,我们想要运行一些集成测试。

在我们的测试中,我们获得Spring Boot以在本地启动Web应用程序,然后我们对api进行一些调用。

如果我们只是运行Web应用程序并点击端点,我们会得到200/OK响应,这是预期的。但是,运行测试时,我们收到401/Unauthorized服务器响应。

在哪里可以查看可能导致授权错误的原因?

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class DemoApplication3IT {
    private final Logger log = LoggerFactory.getLogger(DemoApplication3IT.class);

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void getFunky() throws IOException {
        ResponseEntity<String> response =
            this.restTemplate.getForEntity("http://localhost:8080/api/funky", String.class);
        log.info("TestRestTemplate response Code: " + response.getStatusCode());
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); // Expected :200, Actual   :401
    }
}

使用浏览器访问端点的工作正常,但集成测试失败,这很奇怪。

2 个答案:

答案 0 :(得分:2)

最终,问题是安全性已在单元测试环境中禁用 。解决方案是将以下行添加到application.yml

management.security.enabled: false
management.health.db.enabled: false
security.basic.enabled: false

答案 1 :(得分:0)

您也可以在测试类中添加这样的内容,以节省重复的application.properties:

 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = { TestDataSourceConfig.class },
        properties = {
                "security.basic.enabled=false"
        })

它也应该被这个注释关闭:

@AutoConfigureMockMvc(secure = false)

但目前我无法将其付诸实践(未来可能会有答案:Spring Boot integration test ignoring secure=false in AutoConfigureMockMvc annotation, get 401