有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java测试使用其他测试的内部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: Invalid bean definition with name 'passwordEncoder' defined in class path resource [de/hlservices/timetracking/api/business/event/EventServiceTest$Config.class]: Cannot register bean definition

谢谢你的帮助:)


共 (2) 个答案

  1. # 1 楼答案

    我在我的项目中也遇到了同样的问题,这是因为@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)配置来获取它

  2. # 2 楼答案

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

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

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

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

    IntelliJ IDEA Spring Support

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