I want to exclude the foo repository from my @DataJpaTest annotated test.

@RunWith(SpringRunner.class)
@DataJpaTest(excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com\\.sandbox\\.foo.repository\\..*"))
public class BarRepositoryTest {

    @Autowired
    private BarRepository repository;

    @Test
    public void test() {}

}

Somehow this isn't working and Spring Boot tries to autowire the custom implementation of the foo repository, which fails, because no qualifying Bean of type FooService could be found. I guess this makes sense, since FooService isn't JPA related and shouldn't be picked up by @DataJpaTest.

Foo repository custom implementation:

public class FooRepositoryImpl implements FooRepositoryCustom {

    @Autowired
    private FooService fooService;

}

Foo repository configuration:

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "fooEntityManagerFactory", transactionManagerRef = "fooTransactionManager", basePackages = "com.sandbox.foo")
public class FooDbConfig {
    @ConfigurationProperties(prefix = "foo.datasource")
    public HikariDataSource dataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "fooEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSource()).packages("com.sandbox.foo.entity").persistenceUnit("foo").build();
    }

    @Bean(name = "fooTransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("fooEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

Bar repository configuration:

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "fooEntityManagerFactory", transactionManagerRef = "fooTransactionManager", basePackages = "com.sandbox.foo")
public class FooDbConfig {

    @ConfigurationProperties(prefix = "foo.datasource")
    public HikariDataSource dataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "fooEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSource()).packages("com.sandbox.foo.entity").persistenceUnit("foo").build();
    }

    @Bean(name = "fooTransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("fooEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

}

Main application class:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

Spring Boot Version: 2.0.6.RELEASE

Comment From: philwebb

It's a little confusing, but the excludeFilterson EnableJpaRepositories refer to beans found via @ComponentScan. Spring Data Repository beans are found using a different mechanism, so the filters will not apply to them.

I would recommend either using @Import(FooService.class) or making FooService a @MockBean in your test. You could also consider refactoring your FooRepositoryImpl to try and remove the need for FooService.