Spring Boot 3.4:@MockitoSpyBean 在 @PostConstruct 期间导致 NullPointerException

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

我目前正在将 Spring Boot 应用程序迁移到版本 3.4。

在此版本中,

@MockBean
@SpyBean
已弃用,并替换为
@MockitoBean
@MockitoSpyBean

我已经在类中用

@TestConfiguration
进行了更改,从那时起我的 SpringBootTests 在初始化阶段失败了。

这就是我的配置类的样子:

@TestConfiguration
public class IntegrationTestConfig {

    @MockitoSpyBean
    private LanguageRepository languageRepository;

    @PostConstruct
    void setUp() {
        when(languageRepository.findAllCodes()).thenReturn(List.of("fr", "en"));
    }
}

此配置是通过自定义元注释包含的,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@SpringBootTest(classes = {IntegrationTestConfig.class, SpringSecurityTestConfig.class})
@ActiveProfiles("test")
@Sql(scripts = "classpath:sql/clearTables.sql", executionPhase = ExecutionPhase.AFTER_TEST_METHOD)
@AutoConfigureMockMvc
public @interface IntegrationTest {

}

自从进行此更改后,我现在在

@PostConstruct
执行过程中遇到以下错误:
java.lang.NullPointerException: Cannot invoke "package.whatever.LanguageRepository.findAllCodes()" because "this.languageRepository" is null

如果我恢复到已弃用的 API (

@SpyBean
),则不会发生该错误。使用旧注释一切正常。

我的问题:

  • 我在这里缺少什么?
  • 如何恢复与以前相同的行为,最好不依赖于具有
    @BeforeEach
    设置的基测试类继承?
java spring-boot spring-boot-test
1个回答
0
投票

看起来

@MockitoSpyBean
需要你有一个Mockito能够监视的bean。以前,如果不存在,则使用
@SpyBean
创建 bean。

我做了什么

@MockitoBean(answers = Answers.CALLS_REAL_METHODS)
而不是
@SpyBean
或者您可以确保您实际上在测试配置中自己创建了一个 bean。

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