Настройте Spring @DataJpaTest с настраиваемым базовым хранилищем - PullRequest
0 голосов
/ 03 апреля 2020

Предположим, что пользовательская базовая реализация 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)

Как настроить интеграционный тест для UserRepository, который расширяет интерфейс CustomJpaRepository, и должен ли для этого использовать пользовательскую базовую реализацию?

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?

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я до сих пор не могу объяснить причину проблемы, но ручная настройка JPA решила мою проблему.

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

    ...
}

Я только что импортировал этот дополнительный класс конфигурации в своих тестах, и он работает как чудо .

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

    @Autowired
    private UserRepository userRepository. 
}
0 голосов
/ 04 апреля 2020

Конструктор 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();
}
...