Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试使用其他测试的内部上下文配置_Java_Spring_Testing_Configuration_Spring Data Jpa - Fatal编程技术网

Java 测试使用其他测试的内部上下文配置

Java 测试使用其他测试的内部上下文配置,java,spring,testing,configuration,spring-data-jpa,Java,Spring,Testing,Configuration,Spring Data Jpa,我在我的项目中创建了一个新的测试。对于这个测试,我使用了@ContextConfiguration,内部配置类与测试在同一个类中。但是现在我的其他测试失败了,因为它们正在使用新测试的配置。 这是怎么可能的,我认为从外部使用测试类内部的配置是不可能的 当我从新测试中删除内部配置时,每隔一次测试都可以正常工作 @DataJpaTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ContextConfiguration(classes = Eve

我在我的项目中创建了一个新的测试。对于这个测试,我使用了
@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.beandefinitionOverrideeException:在类路径资源[de/hlservices/timetracking/api/business/EventServiceTest$Config.class]中定义了名为“passwordEncoder”的无效bean定义:无法注册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)
Config来获取它。

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

如果您使用它,请考虑添加<代码>排除过滤器> /代码>,以确保您只得到您真正想要的。您可能希望排除由

@ComponentScan
注释找到的其他配置类:

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


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

删除
@Configuration
。还删除类作为配置类的特殊处理。将其添加到
@Import
不会使其成为
@configuration
意义上的配置类。而是一种配置精简模式(带有
@Bean
方法的常规组件)。这些都被区别对待,可能会导致令人惊讶的效果!。哇,我不知道。谢谢你指出这一点。在我的内部测试配置类上,我没有任何附加的注释。也许这就是为什么我看不出你的答案有任何问题。你说得对,当我删除@Configuration时,所有其他测试都会重新运行。但是现在新的测试不起作用了,因为他没有使用内部配置类
java.lang.IllegalStateException:无法检索@EnableAutoConfiguration基本包
就是这样!非常感谢:)我现在已将过滤器添加到所有配置中。