集成测试:ResourceAccessException:GET 请求上的 I/O 错误服务器重定向太多次

问题描述 投票:0回答:1

我尝试编写集成测试,但它一直失败。这次的错误是关于重定向

O error on GET request for "http://localhost:43331/findAllUser": Server redirected too many  times (20)
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:43331/findAllUser": Server redirected too many  times (20)
at app//org.springframework.web.client.RestTemplate.createResourceAccessException(RestTemplate.java:915)
at app//org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:895)
at app//org.springframework.web.client.RestTemplate.execute(RestTemplate.java:790)
at app//org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:431)
at app//org.springframework.boot.test.web.client.TestRestTemplate.getForEntity(TestRestTemplate.java:244)

我用 testcontainer 编写了集成测试,以替代 mysql 和 TestRestTemplate 来替代 Rest api。这是我的集成测试:

@Testcontainers
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserServiceIntegrationTest {

    @Autowired
    UserRepository userRepository;

    @Autowired
    TestRestTemplate testRestTemplate;

    @Container
    static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:latest");

    @BeforeAll
    static void beforeAll() {
        mysql.start();
    }

    @AfterAll
    static void afterAll() {
        mysql.stop();
    }

    @DynamicPropertySource
    static void configureTestProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", mysql::getJdbcUrl);
        registry.add("spring.datasource.username", mysql::getUsername);
        registry.add("spring.datasource.password", mysql::getPassword);
        registry.add("spring.jpa.hibernate.ddl-auto",() -> "create");
    }

    @BeforeEach
    void setUp() {
    }

    @AfterEach
    public void afterEach(){
        userRepository.deleteAll();
    }

    @Test
    void happyPath_findAllUser_integrationTest() {
        ResponseEntity<UserEntity[]> response = testRestTemplate.getForEntity("/findAllUser", UserEntity[].class);
        assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    }
}

我还有 SSL 设置,可能会导致将 http 重定向到 https:

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.requiresChannel(channel -> channel.anyRequest().requiresSecure()) // redirect HTTP requests to HTTPS
                .authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll())
                .csrf(csrf -> csrf.disable())
                .formLogin(login -> login.disable())
                .httpBasic(httpBasic -> httpBasic.disable());
        return http.build();
    }
}

以及 application.properties 中的配置:

server.port=8443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=keystorepassword
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=selfsignedcertificate
spring-boot ssl http-redirect integration-testing testcontainers
1个回答
0
投票

似乎存在无限重定向循环。

如果可能,请首先使用 powershell cmdlet invoke-webrequest 测试服务器:

$A=(Invoke-WebRequest -Uri "http://abc.lab/getreq1" -MaximumRedirection 0)

您可能会看到包含“MaximumRedirectionExceeded...”短语的错误。还是$A不为空,可以查询:

$a.Headers.Location 将提供要重定向到的第一个位置,但在上面的命令中并未重定向,因为我们故意将最大重定向设置为零。

例如:$A.Headers.Location https://abc.lab/getreq1

同样,当您将最大重定向参数增加 1 时,您可能会看到将重定向到的第二个位置的位置

对于前任。

$B=(Invoke-WebRequest -Uri "http://abc.lab/getreq1" -MaximumRedirection 1)

如果您检查下次要重定向的位置

例如:$B.Headers.Location http://abc.lab/getreq1

这意味着无限循环是由首先发生到 https:// 的重定向引起的,然后再次发生到 http:// 的重定向,这意味着似乎存在无限循环,因此会发生“太多重定向”错误。

然后您可以在服务器端运行跟踪。对于前。如果这是 IIS 服务器,您可以设置“失败请求跟踪”并再次运行 get 请求,并查看参与重定向的模块的跟踪。

© www.soinside.com 2019 - 2024. All rights reserved.