我尝试编写集成测试,但它一直失败。这次的错误是关于重定向
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
似乎存在无限重定向循环。
如果可能,请首先使用 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 请求,并查看参与重定向的模块的跟踪。