集成测试 - 嵌入式码头 - 如何设置数据

时间:2014-11-25 18:11:05

标签: java spring junit integration-testing embedded-jetty

我想知道你通常如何为集成测试设置数据。

当我的测试开始时,我开始使用嵌入式码头:

@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启动的应用程序上下文。

1 个答案:

答案 0 :(得分:0)

我发现有三种解决方案可以为集成测试提供数据:

  1. 使用应用程序上下文启动时正在运行的spring应用程序侦听器

    public class CustomTestInitializer implements ApplicationListener<ContextRefreshedEvent> {
        @Autowired
        CustomService customService;
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
          // TODO: implement you loginc
        }
    }
    
  2. 您可以在配置实体管理器时提供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>
    
  3. 您可以使用Arquillian并在远程服务器(例如JBoss)上执行测试。当您使用难以在嵌入式服务器(CDI,EJB等)上运行的Java EE /容器技术时,强烈建议使用。