0

症状

迁移到 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();
    }

它工作正常。但我还不明白为什么。

4

0 回答 0