如何进行集成测试setUp()操作在嵌入式Jetty容器中运行的内存数据库中的HSQL数据?

时间:2012-01-10 23:02:41

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

我正在尝试针对在maven集成测试阶段内的嵌入式jetty容器中启动的REST Web服务进程运行集成测试。这很有用。

我想配置服务器以使用内存中的HSQL数据库,这样每个JUnit测试都可以设置数据库(创建表,插入记录)并将其拆除(删除记录)。

Web服务进程的应用程序上下文定义了以下数据源:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="#{applicationProperties['jdbc.driver.class.name']}" />
    <property name="url" value="#{applicationProperties['jdbc.url']}" />
    <property name="username" value="#{applicationProperties['db.user']}" />
    <property name="password" value="#{applicationProperties['db.pass']}" />
</bean>

属性:

jdbc.driver.class.name=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:mem:mytestdb
db.user=sa
db.pass=

执行单元测试(不依赖于嵌入式Jetty容器运行)时,此设置工作正常。每个单元测试都创建了数据库并插入了如下记录:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
public class TestBase {

    @Autowired
    protected ApplicationContext context;

    ...

    @Before
    public void setUp() {
        DriverManagerDataSource ds = (DriverManagerDataSource) context.getBean("dataSource");
        // Create tables
        // Insert records
    }
}

使用我的集成测试,这是行不通的 - 因为我的单元测试类无法访问在Jetty中启动我的服务器时创建的数据源以插入/删除数据。

我的问题:

  • 如何在嵌入式Jetty容器中配置HSQL,以便我的单元测试setUp()方法可以操作数据?

1 个答案:

答案 0 :(得分:0)

在这里发布我自己的解决方案,以防它对其他人有用。

好吧,所以我最终没有像我希望的那样解决这个问题。

我找不到让集成测试将数据插入服务器上运行的内存中HSQL数据库的方法。

因此,不是以这种方式解决我的问题,我让服务器本身只是在启动时加载数据。在src / test下,我添加了一个DB初始化servlet,它将启动内存中的HSQL DB,然后执行insert语句来加载测试数据。然后我将web.xml从src / main / webapp复制到src / test / webapp(不喜欢这样做),并将这个测试servlet添加到启动时加载。

因此,测试本身实际上并没有在测试之间插入数据,而是在我的新测试servlet上调用doget()方法来告诉它刷新内存数据库。