使用自定义基础存储库配置 Spring @DataJpaTest

Configure Spring @DataJpaTest with custom base repository

让我们假设自定义基础 JpaRepository 实现如下所示。

public class SimpleCustomJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements CustomJpaRepository<T, ID> {

    @Override
    public List<T> findAllCustom() {

        ...
    }
}

基本存储库使用 @EnableJpaRepositories 注释注册。

@EnableJpaRepositories(value = "org.somebody.repository", repositoryBaseClass = SimpleCustomJpaRepository.class)

我应该如何为扩展 CustomJpaRepository 接口的 UserRepository 配置集成测试,因此应该使用自定义基础实现?

public interface UserRepository extends CustomJpaRepository<User, Long> { ... }

当前使用的集成测试失败 org.springframework.data.mapping.PropertyReferenceException: No property findAllCustom found for type User!。实际上它未能加载 ApplicationContext,因为我的自定义基础存储库实现在集成测试期间未注册,因此未找到 findAllCustom 的实现。

@ExtendWith(SpringExtension.class)
@DataJpaTest
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository. 
}

我应该如何注册自定义 JpaRepository 实现并结合 JPA 存储库集成测试?

SimpleCustomJpaRepository 的构造函数应该如下所示:

public class SimpleCustomJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements CustomJpaRepository<T, ID> {

    private final EntityManager entityManager;

    public SimpleCustomJpaRepository(JpaEntityInformation entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityManager = entityManager;
    }

    @Override
    public List<T> findAllCustom() {

        ...
    }
}

此外,确保接口 CustomJpaRepository 注释为:

@NoRepositoryBean
public interface CustomJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    List<T> findAllCustom();
}

我仍然无法解释问题的原因,但是手动配置 JPA 已经解决了我的问题。

@TestConfiguration
@EnableAutoConfiguration(exclude = {JpaRepositoriesAutoConfiguration.class})
@EnableJpaRepositories(value = "org.somebody.repository", repositoryBaseClass = SimpleCustomJpaRepository.class)
public class JpaTestConfig {

    ...
}

我刚刚在我的测试中导入了这个额外的配置 class,它非常有效。

@ExtendWith(SpringExtension.class)
@DataJpaTest
@Import(JpaTestConfig.class)
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository. 
}