0

Я реализовал PersistenceUnitPostProcessor для сканирования объектов в разных пакетах и ​​не перечисления их в файле persistence.xml.PersistenceUnitPostProcessor Реализация не работает во время теста junit

К сожалению, он работает только во время развертывания, но не при выполнении тестов junit.

Процессор объявлен в XML-контекст приложения как следующие:

<bean id="entityManagerFactoryMdm" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitPostProcessors"> 
     <list> 
      <bean class="com.mypackage.MyPersistenceUnitPostProcessor" /> 
     </list> 
    </property> 
</bean> 

Пакеты перечислены как:

<util:properties id="entitiesScanProperties"> 
    <prop key="packagesToScan">package1.entities,package2.entities.view,package3.entities</prop> 
</util:properties> 

Логика:

public class MyPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor { 

    @Autowired 
    private ResourcePatternResolver resourceLoader; 

    @Value("#{entitiesScanProperties['packagesToScan']}") 
    private String[] packagesToScan; 

    @Override 
    public void postProcessPersistenceUnitInfo(final MutablePersistenceUnitInfo mutablePersistenceUnitInfo) { 
     try { 
      List<Resource> resourcesList = new ArrayList<Resource>(); 
      for (String packageToScan : packagesToScan) { 
       packageToScan = packageToScan.replace(".", "/"); 
       final Resource[] packageResources = resourceLoader.getResources(String.format("classpath:%s/*.class", packageToScan)); 
       resourcesList.addAll(Arrays.asList(packageResources)); 
      } 
      final Resource[] resources = new Resource[resourcesList.size()]; 
      resourcesList.toArray(resources); 

      for (Resource resource : resources) { 
       final CachingMetadataReaderFactory cachingMetadataReaderFactory = new CachingMetadataReaderFactory(); 
       final MetadataReader metadataReader = cachingMetadataReaderFactory.getMetadataReader(resource); 
       if (metadataReader.getAnnotationMetadata().isAnnotated(javax.persistence.Entity.class.getName())) { 
        mutablePersistenceUnitInfo.addManagedClassName(metadataReader.getClassMetadata().getClassName()); 
       } 
      } 
      mutablePersistenceUnitInfo.setExcludeUnlistedClasses(true); 
     } 
     catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     } 
    } 

Определение теста:

@ContextConfiguration(locations = { "classpath:application-context-test.xml" }) 
@DatabaseDataAsResource(locations = { "/META-INF/testdata/dbunit/master-dataset.xml", "/META-INF/testdata/dbunit/complaints-dataset.xml" }) 
public class FuelComplaintServiceImplIntegrationTest extends TestBase { 
} 

супер класс:

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, TestExecutionLifecycleListener.class }) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public abstract class TestBase { 

} 

Я получаю это исключение:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private  com.company.repository.DataProviderRepository com.company.service.impl.ProviderConfigurationServiceImpl.dataProviderRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataProviderRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an managed type: class package1.entities.DataProviderEntity 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) 
... 43 more 

Что может быть проблема, что процессор работает в течение deplyoment но не druing модульного тестирования? Я что-то наблюдаю?

Любой намек приветствуется.

ответ

0

Для тех, кто может встретить такую ​​проблему.

Причиной ошибки было это выражение:

"classpath:%s/*.class" 

Изменение его:

"classpath*:%s/*.class" 

решить эту ошибку.

Проблема заключалась в том, что первое выражение будет выглядеть только в первом найденном пути. Некоторые необходимые классы не будут такими, как в этом случае Существами, вызывающими такие сообщения об ошибках.

Второе выражение сообщит ресурсу ResourcePatternResolver посмотреть во всех каталогах классов, соответствующих шаблону пути, например.

../classes/package1/Entity.class 

../test-classes/package1/ServiceTest.class 

В моем случае, это выглядело, прежде чем только:

Надеется, что это поможет кому-то.