我的公司正在使用Spring Boot,Spring MVC,带有EclipseLink的JPA和动态编织来开发Web应用程序。 我的任务是使用JUnit和@SpringBootTest准备UI和集成测试的实现,并使用Selenium与它进行交互。
如Spring Boot Testing Features所述,
使用@SpringBootApplication
注释的测试可以使用@MockBean
注释在ApplicationContext中为bean定义Mockito模拟。
这是通过注册BeanFactoryPostProcessor
,MockitoPostProcessor
,递归扫描使用@Component
或@Configuration
注释的类来完成注释@MockBean
的类和字段。
不幸的是,这会导致在应该扫描它们的LocalContainerEntityManagerFactoryBean
被实例化并设置为LoadTimeWeaver
之前加载这些类中引用的实体类,从而导致加载时间编织对于那些要跳过的实体。
对于执行持久性操作时由NoSuchMethodException
编织而创建的方法,这会导致_persistence_propertyChange()
。
是否可以在EclipseLink和动态编织中使用@SpringBootTest
?
如果没有,那么设置集成测试的替代方案是什么
最近的Spring Boot版本?
答案 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