JUnit + Derby + Spring:每次测试后都会丢弃内存数据库

Puc*_*uce 6 java junit spring derby in-memory-database

在我的单元测试中,我自动安装了一些使用URL的DataSources

jdbc:derby:memory:mydb;create=true
Run Code Online (Sandbox Code Playgroud)

创建内存中的DB.

要删除内存中的Derby数据库,您必须连接:

jdbc:derby:memory:mydb;drop=true
Run Code Online (Sandbox Code Playgroud)

我想在每次测试后都会发生这种情况,并从一个新的数据库开始.我怎么能用Spring做到这一点?

Puc*_*uce 5

如何正确关闭 Derby 内存数据库

给了我一个解决方案的提示:

    mydb.drop.url = jdbc:derby:memory:mydb;drop=true

    ...

    <bean id="mydbDropUrl" class="java.lang.String">
    <constructor-arg value="${mydb.drop.url}" />
</bean>

    ...

    @Resource
private String mydbDropUrl;        

    @After
public void tearDown() {
    try {
        DriverManager.getConnection(mydbDropUrl);
    } catch (SQLException e) {
        // ignore
    }
}
Run Code Online (Sandbox Code Playgroud)

一个缺点是使用接受 String 的 String 构造函数(围绕不可变 String 对象的不可变 String 对象)。我读到 Spring 3 中有一个 @Value 注释,这可能会有所帮助,但我使用的是 Spring 2.5。

如果您有更好的解决方案,请告诉我。


tek*_*kbe 5

如果将Spring与Hibernate一起使用,则有一种与数据库无关的方法.

确保在每个测试方法之前/之后创建/销毁应用程序上下文:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:application-context-test.xml"})
@TestExecutionListeners({DirtiesContextTestExecutionListener.class, 
    DependencyInjectionTestExecutionListener.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class AbstractTest {

}
Run Code Online (Sandbox Code Playgroud)

指示Hibernate在启动时自动创建模式,并在关闭时删除模式:

hibernate.hbm2ddl.auto = create-drop
Run Code Online (Sandbox Code Playgroud)

现在每次测试之前

  • 创建应用程序上下文并注入所需的spring bean(spring)
  • 创建数据库结构(休眠)
  • 如果存在则执行import.sql(休眠)

每次测试后

  • 应用程序上下文被破坏(春天)
  • 删除数据库模式(休眠).

如果您使用的是交易,则可能需要添加TransactionalTestExecutionListener.