猿问

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

我在我的项目中创建了一个新测试。对于这个,我@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

@Transactional

public 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 定义


感谢您的帮助 :)


潇潇雨雨
浏览 109回答 2
2回答

蝴蝶不菲

正如 Maciej Kowalski 指出的那样,这个问题可能与@ComponentScan注释有关。如果您正在使用它,请考虑添加一个excludeFilter以确保您只得到您真正想要的。您可能希望排除注释找到的其他配置类@ComponentScan:@ComponentScan(excludeFilters = {         @ComponentScan.Filter(type = FilterType.ANNOTATION,                 value = Configuration.class) })顺便说一句:我真的推荐使用 IntelliJ IDEA 作为 IDE,因为它有很棒的 spring 支持。您可以通过单击代码左侧的绿色图标(第 9 行)来查找通过扫描找到的 bean/组件:这使得调试扫描问题更加容易。

明月笑刀无情

我在我的项目中遇到了同样的问题,这是因为@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)配置无论如何选择它。
随时随地看视频慕课网APP

相关分类

Java
我要回答