症状
迁移到 SpringBoot 2.4.4 后,我们在运行 Junit 测试时遇到了 StackOverflowError:
2021-04-28 08:49:50.608 DEBUG 27312 --- [pool-2-thread-1] o.s.j.d.DataSourceTransactionManager : Initiating transaction commit
2021-04-28 08:49:50.608 DEBUG 27312 --- [pool-2-thread-1] o.s.j.d.DataSourceTransactionManager : Committing JDBC transaction on Connection [HikariProxyConnection@1824360786 wrapping conn0: url=jdbc:h2:mem:xxxxxxx user=yyyyyyy]
2021-04-28 08:49:50.609 DEBUG 27312 --- [pool-2-thread-1] o.s.j.d.DataSourceTransactionManager : Releasing JDBC Connection [HikariProxyConnection@1824360786 wrapping conn0: url=jdbc:h2:mem:xxxxxx user=yyyyy] after transaction
java.lang.StackOverflowError
at java.lang.Throwable.getOurStackTrace(Throwable.java:825)
at java.lang.Throwable.getStackTrace(Throwable.java:817)
at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:55)
这仅发生在我们的一个模块上,其他模块工作正常。
我们使用 Mockito 来模拟我们的控制器,springboot-test 2.4.4 附带的版本。
回滚到版本 2.3.X 时,测试按预期工作。
编辑:原因
经过一番挖掘,我找到了原因。在模块的 SecurityConfig 中,我们以这种方式设置 AuthenticationManager :
@Bean
public AuthenticationManager customAuthenticationManager() throws Exception {
return authenticationManager();
}
事实证明,这些行仅在运行测试时才导致 StackOverflowError
如果我将其更改为
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
它工作正常。但我还不明白为什么。