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基本包
就是这样!非常感谢:)我现在已将过滤器添加到所有配置中。