为了账号安全,请及时绑定邮箱和手机立即绑定

测试使用其他测试的内部 ContextConfiguration

测试使用其他测试的内部 ContextConfiguration

潇潇雨雨 2023-05-10 13:59:46
我在我的项目中创建了一个新测试。对于这个,我@ContextConfiguration在与测试相同的类中使用了一个内部配置类。但是现在我的其他测试都失败了,因为它们正在使用新测试的配置。这怎么可能,我认为不可能从外部使用测试类内部的配置。当我从新测试中删除内部配置时,所有其他测试再次正常工作。@DataJpaTest@TestInstance(TestInstance.Lifecycle.PER_CLASS)@ContextConfiguration(classes = EventServiceTest.Config.class)class EventServiceTest {    @Configuration    @Import({WorkingTimeConfig.class,             PartnerConfig.class,             ProjectConfig.class,             UserConfig.class,             AccountGroupConfig.class,             LanguageConfig.class,             CountryConfig.class,             EventConfig.class,             LanguageConfig.class})    static class Config {        @SuppressWarnings("unused")        @MockBean(reset = MockReset.BEFORE)        private UserAttendanceBoard userAttendanceBoard;        @Bean        public PasswordEncoder passwordEncoder() {            return PasswordEncoderFactories.createDelegatingPasswordEncoder();        }        @Bean        public ImpersonateProperties impersonateProperties() {            return new ImpersonateProperties();        }    }...}现在这个测试不起作用:@Import(MailSenderAutoConfiguration.class)@DataJpaTest@Transactionalpublic class ServiceTimeEntryServiceTest {    private ServiceTimeService serviceTimeService;    private ServiceTimeEntryRepository repository;    @Autowired    public ServiceTimeEntryServiceTest(ServiceTimeService serviceTimeService, ServiceTimeEntryRepository repository) {        this.serviceTimeService = serviceTimeService;        this.repository = repository;    }    @Test    void getAllByAccountId() {...}如果我尝试开始我的旧测试,则会抛出此错误:org.springframework.beans.factory.support.BeanDefinitionOverrideException:在类路径资源 [de/hlservices/timetracking/api/business/event/EventServiceTest$Config.class] 中定义了名称为“passwordEncoder”的无效 bean 定义:无法注册 bean 定义感谢您的帮助 :)
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

正如 Maciej Kowalski 指出的那样,这个问题可能与@ComponentScan注释有关。

如果您正在使用它,请考虑添加一个excludeFilter以确保您只得到您真正想要的。您可能希望排除注释找到的其他配置类@ComponentScan

@ComponentScan(excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,
                value = Configuration.class)
})

顺便说一句:我真的推荐使用 IntelliJ IDEA 作为 IDE,因为它有很棒的 spring 支持。您可以通过单击代码左侧的绿色图标(第 9 行)来查找通过扫描找到的 bean/组件:

//img1.sycdn.imooc.com//645b330c00012c0002640052.jpg

这使得调试扫描问题更加容易。



查看完整回答
反对 回复 2023-05-10
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

我在我的项目中遇到了同样的问题,这是因为@ComponentScan由于注释,它也在拾取那个类@Configuration

当我删除该注释并因此使组件扫描忽略它时,一切正常。所以你可以这样:

@Import({WorkingTimeConfig.class,
             PartnerConfig.class,
             ProjectConfig.class,
             UserConfig.class,
             AccountGroupConfig.class,
             LanguageConfig.class,
             CountryConfig.class,
             EventConfig.class,
             LanguageConfig.class})
    static class Config {

删除@Configuration注解并没有阻止@ContextConfiguration(classes = EventServiceTest.Config.class)配置无论如何选择它。


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信