@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)