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

0x1*_*C1B 3 java spring spring-data-jpa spring-boot spring-boot-test

让我们假设一个自定义的基本JpaRepository实现如下所示。

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

    @Override
    public List<T> findAllCustom() {

        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

基础存储库是使用@EnableJpaRepositories注释注册的。

@EnableJpaRepositories(value = "org.somebody.repository", repositoryBaseClass = SimpleCustomJpaRepository.class)
Run Code Online (Sandbox Code Playgroud)

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

public interface UserRepository extends CustomJpaRepository<User, Long> { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

    @Autowired
    private UserRepository userRepository. 
}
Run Code Online (Sandbox Code Playgroud)

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

0x1*_*C1B 6

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

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

我刚刚在测试中导入了这个额外的配置类,它的工作方式就像一个魅力。

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

    @Autowired
    private UserRepository userRepository. 
}
Run Code Online (Sandbox Code Playgroud)