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



我正在尝试对一个REST web服务进程运行集成测试,该进程在maven集成测试阶段的嵌入式jetty容器中启动。这么多正在发挥作用。

我想将服务器配置为使用内存中的HSQLDB,这样每个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()方法可以操作数据

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

好吧,所以我最终没有按照我希望的方式解决这个问题。

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

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

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

最新更新