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

发布于 2024-12-25 22:29:04 字数 1720 浏览 1 评论 0原文

我正在尝试针对 REST Web 服务进程运行集成测试,该进程是在 Maven 集成测试阶段在嵌入式 jetty 容器中启动的。就这么多了。

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

I am trying to run integration tests against a REST web service process that is started in an embedded jetty container within the maven integration test phase. That much is working.

I want to configure the server to use an in-memory HSQL DB such that each JUnit test can setup the database (create tables, insert records), and tear it down (delete the records).

The application context of the web services process defines the following datasource:

<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>

Properties:

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

When executing unit tests (that did not rely on the embedded Jetty container to be running), this setup worked fine. Each unit test created the database and inserted the records like so:

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
    }
}

With my integration tests, this is not working -apparently because the datasource that is created when my server is started in Jetty is not accessible by my unit test class to insert/delete the data.

My question:

  • How can I configure HSQL in my embedded Jetty container so that my unit test setUp() method can manipulate the data?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

好倦 2025-01-01 22:29:04

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

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

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

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

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

Posting my own solution here in case it's useful down the road to someone else.

Allright, so I didn't end up solving this the way I had hoped.

I could not find a way to have my integration tests insert data into the in-memory HSQL database that was running on the server.

So instead of solving my problem this way, I had the server itself just load the data on startup. Under src/test, I added a DB initialization servlet that would start the in-memory HSQL DB, then execute the insert statements to load the test data. I then copied the web.xml from src/main/webapp to src/test/webapp (didn't like having to do this), and added this test servlet to load on startup.

So, the tests themselves don't actually insert the data in between tests, but they call a doget() method on my new test servlet to tell it to refresh the in-memory database.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文