我正在尝试针对在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中启动我的服务器时创建的数据源以插入/删除数据。
我的问题:
答案 0 :(得分:0)
在这里发布我自己的解决方案,以防它对其他人有用。
好吧,所以我最终没有像我希望的那样解决这个问题。我找不到让集成测试将数据插入服务器上运行的内存中HSQL数据库的方法。
因此,不是以这种方式解决我的问题,我让服务器本身只是在启动时加载数据。在src / test下,我添加了一个DB初始化servlet,它将启动内存中的HSQL DB,然后执行insert语句来加载测试数据。然后我将web.xml从src / main / webapp复制到src / test / webapp(不喜欢这样做),并将这个测试servlet添加到启动时加载。
因此,测试本身实际上并没有在测试之间插入数据,而是在我的新测试servlet上调用doget()方法来告诉它刷新内存数据库。