Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让integration tests setUp()操作运行在嵌入式Jetty容器中的内存数据库中的HSQL数据?_Java_Spring_Integration Testing_Hsqldb_Embedded Jetty - Fatal编程技术网

Java 如何让integration tests setUp()操作运行在嵌入式Jetty容器中的内存数据库中的HSQL数据?

Java 如何让integration tests setUp()操作运行在嵌入式Jetty容器中的内存数据库中的HSQL数据?,java,spring,integration-testing,hsqldb,embedded-jetty,Java,Spring,Integration Testing,Hsqldb,Embedded Jetty,我正在尝试对RESTWeb服务流程运行集成测试,该流程在maven集成测试阶段的嵌入式jetty容器中启动。这一点正在发挥作用 我想将服务器配置为使用内存中的HSQL DB,这样每个JUnit测试都可以设置数据库(创建表、插入记录),并将其拆下(删除记录) web服务流程的应用程序上下文定义了以下数据源: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

我正在尝试对RESTWeb服务流程运行集成测试,该流程在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>
执行单元测试(不依赖要运行的嵌入式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,以便我的unit test setUp()方法可以操作数据
在这里发布我自己的解决方案,以防它对其他人有用

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

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

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

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

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