我想知道你通常如何为集成测试设置数据。
当我的测试开始时,我开始使用嵌入式码头:
@Before
public void startServer() throws Exception {
server = new Server(8080);
server.setStopAtShutdown(true);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setDescriptor("WEB-INF/embedded-web.xml");
webAppContext.setContextPath("/core-test");
webAppContext.setResourceBase("src/main/webapp");
webAppContext.setClassLoader(getClass().getClassLoader());
server.addHandler(webAppContext);
server.start();
}
在embedded-web.xml中有一个对spring应用程序上下文的引用:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext-test.xml</param-value>
</context-param>
在applicationContext-test.xml中,内存h2数据库中有一个配置:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" />
</bean>
最好的解决方案是将Spring服务类自动装入测试然后设置数据库,但我想这是不可能访问jetty启动的应用程序上下文。
答案 0 :(得分:0)
我发现有三种解决方案可以为集成测试提供数据:
使用应用程序上下文启动时正在运行的spring应用程序侦听器
public class CustomTestInitializer implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
CustomService customService;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// TODO: implement you loginc
}
}
您可以在配置实体管理器时提供sql导入文件(it-test-init.sql位于src / test / resouces中):
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
<prop key="hibernate.hbm2ddl.import_files">it-test-init.sql</prop>
</props>
</property>
</bean>
您可以使用Arquillian并在远程服务器(例如JBoss)上执行测试。当您使用难以在嵌入式服务器(CDI,EJB等)上运行的Java EE /容器技术时,强烈建议使用。