Тест Spring Boot 2: Как я могу иметь только один EntityManager? - PullRequest
0 голосов
/ 08 апреля 2020

Я переношу проект из Spring Boot 1.5 -> 2.2 и у меня возникла проблема с переопределениями bean-компонентов для интеграционного теста для класса-оболочки, который настраивает ModelMapper для преобразования классов сущностей в dtos для доставки во внешний интерфейс.

В моем файле application-test.properties я разрешаю переопределение bean-компонента:

spring.main.allow-bean-definition-overriding=true

У меня есть тестовый класс конфигурации, который переопределяет производственный экземпляр EntityManager (или это было весной Загрузка 1.5 ...):

@TestConfiguration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.package")
@EnableJpaAuditing(auditorAwareRef = "mockAuditorAware")
@EnableWebSecurity
public class BackendTestConfiguration {

  @Bean(name = "testEmf")
  @Primary
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(DriverManagerDataSource dataSource) {
    LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
    entityManager.setDataSource(dataSource);
    entityManager.setPackagesToScan("com.example");
    entityManager.setJpaVendorAdapter( new HibernateJpaVendorAdapter() );
    return entityManager;
  }
}testE

И класс теста:

@ExtendWith(SpringExtension.class)
@TestPropertySource("classpath:/application-test.properties")
@SpringBootTest(classes = {WrapperTestConfiguration.class})
@ComponentScan(basePackages = "com.example.package")
class MyModelMapperTest {


  private MyModelMapper modelMapper;

  @Autowired
  LotteryModelMapperTest(MyModelMapper mm) {
    this.modelMapper = mm;
  }

  // test cases

} 

Если я запускаю тестовые примеры с переопределенным компонентом, присутствующим в конфигурации теста, тест завершается неудачно

NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManager' available: expected single matching bean but found 2: org.springframework.orm.jpa.SharedEntityManagerCreator#0,org.springframework.orm.jpa.SharedEntityManagerCreator#1

Однако удаление любого из настроенных EntityManagerFactory bean-компонентов (тестовых или производственных) приводит к

NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected at least 1 bean which qualifies as autowire candidate.

Так что я, кажется, получаю два экземпляра или ноль экземпляров. Как настроить это так, чтобы я переопределял bean-компонент в рабочей конфигурации с тем, что в тестовой конфигурации?

...