@Repository 未在@DataJpaTest 中自动装配,多个@Configuration 文件被导入到一个配置文件中
@Repository Not Being Autowired in @DataJpaTest with multiple @Configuration files being imported in one Configuration file
我有3个@Configuration文件,如下:
MessageGatewayConfiguration.class
@Configuration
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages = {
"xyz.idtlabs.smsgateway.*"
})
@EntityScan(basePackageClasses = {
AbstractPersistableCustom.class,
SMSBridge.class,
SMSBridgeConfig.class,
SMSMessage.class,
Tenant.class
})
@ComponentScan(basePackages = {
"xyz.idtlabs.smsgateway.*"
})
public class MessageGatewayConfiguration {
public MessageGatewayConfiguration() {
super();
}
@Bean
public SimpleApplicationEventMulticaster applicationEventMulticaster() {
final SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
multicaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
return multicaster;
}
@Bean
public HandlerExceptionResolver sentryExceptionResolver() {
return new io.sentry.spring.SentryExceptionResolver();
}
}
SpringConfiguration.class
@Configuration
@EnableMetrics
public class SpringConfiguringClass extends MetricsConfigurerAdapter {
@Override
public void configureReporters(MetricRegistry metricRegistry) {
// registerReporter allows the MetricsConfigurerAdapter to
// shut down the reporter when the Spring context is closed
registerReporter(ConsoleReporter
.forRegistry(metricRegistry)
.build())
.start(1, TimeUnit.MINUTES);
}
}
SmsFireboltConfiguration.class
@Configuration
@Import({ MessageGatewayConfiguration.class, SpringConfiguringClass.class })
public class SmsFireboltConfiguration {
}
主要应用文件如下:
public class MessageGateway {
public MessageGateway() {
super();
}
public static void main(String[] args) {
SpringApplication.run(SmsFireboltConfiguration.class, args);
}
}
但是,我的 Spring @DataJpaTest 集成测试没有自动装配 TenantRepository JPA 存储库,出现 "No qualifying bean of type 'xyz.idtlabs.smsgateway.tenants.repository.TenantRepository' available: expected at least 1 bean which qualifies as autowire candidate" 错误。
其代码如下:
@DataJpaTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes=MessageGateway.class)
@AutoConfigureTestDatabase(connection = H2)
public class SmsMessageServiceIntegrationTest {
@Autowired
private TenantRepository tenantRepository;
@After
public void tearDown() throws Exception {
tenantRepository.deleteAll();
}
@Test
//some test
}
关于这是为什么的任何可能的想法?我尝试了多种设置 @DataJpaTest 文件的组合,但无济于事。
您指定了一个非配置 class 到 @ContextConfiguration
。
您需要的是:
@ContextConfiguration(classes = MessageGatewayConfiguration.class)
或者如果您想包含所有 Spring 配置,请执行以下操作:
@ContextConfiguration(classes = SmsFireboltConfiguration.class)
我有3个@Configuration文件,如下:
MessageGatewayConfiguration.class
@Configuration
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages = {
"xyz.idtlabs.smsgateway.*"
})
@EntityScan(basePackageClasses = {
AbstractPersistableCustom.class,
SMSBridge.class,
SMSBridgeConfig.class,
SMSMessage.class,
Tenant.class
})
@ComponentScan(basePackages = {
"xyz.idtlabs.smsgateway.*"
})
public class MessageGatewayConfiguration {
public MessageGatewayConfiguration() {
super();
}
@Bean
public SimpleApplicationEventMulticaster applicationEventMulticaster() {
final SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
multicaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
return multicaster;
}
@Bean
public HandlerExceptionResolver sentryExceptionResolver() {
return new io.sentry.spring.SentryExceptionResolver();
}
}
SpringConfiguration.class
@Configuration
@EnableMetrics
public class SpringConfiguringClass extends MetricsConfigurerAdapter {
@Override
public void configureReporters(MetricRegistry metricRegistry) {
// registerReporter allows the MetricsConfigurerAdapter to
// shut down the reporter when the Spring context is closed
registerReporter(ConsoleReporter
.forRegistry(metricRegistry)
.build())
.start(1, TimeUnit.MINUTES);
}
}
SmsFireboltConfiguration.class
@Configuration
@Import({ MessageGatewayConfiguration.class, SpringConfiguringClass.class })
public class SmsFireboltConfiguration {
}
主要应用文件如下:
public class MessageGateway {
public MessageGateway() {
super();
}
public static void main(String[] args) {
SpringApplication.run(SmsFireboltConfiguration.class, args);
}
}
但是,我的 Spring @DataJpaTest 集成测试没有自动装配 TenantRepository JPA 存储库,出现 "No qualifying bean of type 'xyz.idtlabs.smsgateway.tenants.repository.TenantRepository' available: expected at least 1 bean which qualifies as autowire candidate" 错误。 其代码如下:
@DataJpaTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes=MessageGateway.class)
@AutoConfigureTestDatabase(connection = H2)
public class SmsMessageServiceIntegrationTest {
@Autowired
private TenantRepository tenantRepository;
@After
public void tearDown() throws Exception {
tenantRepository.deleteAll();
}
@Test
//some test
}
关于这是为什么的任何可能的想法?我尝试了多种设置 @DataJpaTest 文件的组合,但无济于事。
您指定了一个非配置 class 到 @ContextConfiguration
。
您需要的是:
@ContextConfiguration(classes = MessageGatewayConfiguration.class)
或者如果您想包含所有 Spring 配置,请执行以下操作:
@ContextConfiguration(classes = SmsFireboltConfiguration.class)