使用自定义基础存储库配置 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.
}
让我们假设自定义基础 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.
}