@SpringBootTest干扰EclipseLink动态编织

时间:2017-07-28 16:34:33

标签: jpa spring-boot junit eclipselink load-time-weaving

我的公司正在使用Spring Boot,Spring MVC,带有EclipseLink的JPA和动态编织来开发Web应用程序。 我的任务是使用JUnit和@SpringBootTest准备UI和集成测试的实现,并使用Selenium与它进行交互。

Spring Boot Testing Features所述, 使用@SpringBootApplication注释的测试可以使用@MockBean注释在ApplicationContext中为bean定义Mockito模拟。 这是通过注册BeanFactoryPostProcessorMockitoPostProcessor,递归扫描使用@Component@Configuration注释的类来完成注释@MockBean的类和字段。

不幸的是,这会导致在应该扫描它们的LocalContainerEntityManagerFactoryBean被实例化并设置为LoadTimeWeaver之前加载这些类中引用的实体类,从而导致加载时间编织对于那些要跳过的实体。 对于执行持久性操作时由NoSuchMethodException编织而创建的方法,这会导致_persistence_propertyChange()

是否可以在EclipseLink和动态编织中使用@SpringBootTest? 如果没有,那么设置集成测试的替代方案是什么 最近的Spring Boot版本?

2 个答案:

答案 0 :(得分:0)

我通过使用自定义SpringApplicationRunListener contextPrepared()来解决问题,以便在Spring执行之前从BeanFactoryPostProcessor中删除有问题的ApplicationContext

答案 1 :(得分:0)

我们在使用Spring Boot 2.1.6和EclipseLink 2.7.6构建的Web应用程序中遇到了相同的问题。

是否可以将@SpringBootTest与EclipseLink和动态编织一起使用?如果不是,那么为最近的Spring Boot版本设置集成测试的最佳选择是什么?

解决方案是将eclipselink.weaving中的false JPA属性设置为@SpringBootTest,并在常规操作中将true设置为<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="jpaProperties"> <props> <prop key="eclipselink.weaving">${jpa.eclipselink.weaving}</prop> </props> </property> <!-- ... --> </bean>

持久性配置:

application.properties

然后在jpa.eclipselink.weaving=true 中输入

@TestPropertySource(properties = "jpa.eclipselink.weaving=false")

在JUnit测试类上:

Dataframe: Inputdata
  column1    column2    column3      date_column  column4
  <chr>      <chr>      <chr>        <chr>         <chr>
1 1111       6          fff          2015-11-01    MCA
2 2222       1          aaa          2006-12-02    NA
3 3333       2          bbb          2007-10-03    NA
4 4444       3          ccc          2008-01-04    NA
5 555        4          ddd          2007-11-05    NA
6 6666       5          eee          2010-11-06    BCH


R script :
Target1Conn<-dbConnect(odbc::odbc(), dsn = "TARGETDB", uid = "username", pwd = "password")
insert <- dbSendQuery(Target1Conn, paste0('insert into ', outputTableName, '(column1,column2,column3,date_column,column4) values(?,?,?,?,?)'))
dbBind(insert, list(InputData$column1,InputData$column2,InputData$column3,InputData$date_column,InputData$column4))"

Error:
Error in result_bind(res@ptr, as.list(params), batch_rows) :
  nanodbc/nanodbc.cpp:1617: 00000: [Oracle][ODBC][Ora]ORA-01861: literal does not match format string