我目前正在将 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
设置的基测试类继承?看起来
@MockitoSpyBean
需要你有一个Mockito能够监视的bean。以前,如果不存在,则使用 @SpyBean
创建 bean。
我做了什么
@MockitoBean(answers = Answers.CALLS_REAL_METHODS)
而不是 @SpyBean
或者您可以确保您实际上在测试配置中自己创建了一个 bean。