在我的单元测试中,我自动使用了一些使用URL的数据源

jdbc:derby:memory:mydb;create=true

创建一个内存DB。

要丢弃内存的德比DB,您必须与:

jdbc:derby:memory:mydb;drop=true

我希望每次测试后都会发生这种情况,并从新鲜的DB开始。我该如何使用弹簧进行操作?

有帮助吗?

解决方案 2

如何正确关闭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
    }
}

缺点是使用字符串构造函数,该字符串构造函数接受字符串(周围不变的字符串对象周围的不变字符串对象)。我读到春季3中有@Value注释,在这里可能会有所帮助,但我正在使用Spring 2.5。

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

其他提示

如果您与Hibernate一起使用Spring,则有一种数据库 - 不合SNOSTIC的方法可以做到这一点。

确保在每种测试方法之前 /之后都会创建 /破坏应用程序上下文:

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

}

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

hibernate.hbm2ddl.auto = create-drop

现在在每次测试之前

  • 创建应用程序上下文,并注入所需的弹簧豆(春季)
  • 创建数据库结构(Hibernate)
  • 如果存在(Hibernate),则执行import.sql

在每次测试之后

  • 申请上下文被破坏(春季)
  • 数据库模式被删除(Hibernate)。

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

春季测试3之后,您可以使用注释来注入配置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-test.xml")
public class MyTest {
}

只是做类似的事情:

public class DatabaseTest implements ApplicationContextAware {
    private ApplicationContext context;
    private DataSource source;

    public void setApplicationContext(ApplicationContext applicationContext) {
        this.context = applicationContext;
    }

    @Before
    public void before() {
        source = (DataSource) dataSource.getBean("dataSource", DataSource.class);
    }

    @After
    public void after() {
        source = null;
    }
}

使豆具有原型范围(scope="prototype")。在每次测试之前,这将获得数据源的新实例。

如果您使用 春季测验 图书馆,您可以做这样的事情:

public class MyDataSourceSpringTest extends
AbstractTransactionalDataSourceSpringContextTests {

    @Override
    protected String[] getConfigLocations() {
        return new String[]{"classpath:test-context.xml"};
    }

    @Override
    protected void onSetUpInTransaction() throws Exception {
        super.deleteFromTables(new String[]{"myTable"});
        super.executeSqlScript("file:db/load_data.sql", true);
    }
}

并根据最新评论进行了更新的版本,该版本会在每次测试之前删除DB并重新创建表:

public class MyDataSourceSpringTest extends
    AbstractTransactionalDataSourceSpringContextTests {

        @Override
        protected String[] getConfigLocations() {
            return new String[]{"classpath:test-context.xml"};
        }

        @Override
        protected void onSetUpInTransaction() throws Exception {
            super.executeSqlScript("file:db/recreate_tables.sql", true);
        }
}

这就是我们在每次测试开始时所做的。

  1. 删除所有以前的对象。

  2. 创建create_table.sql中提到的所有表格

  3. 根据要测试的内容将值插入创建的表。

      @Before
      public void initialInMemoryDatabase() throws IOException, FileNotFoundException {
    
      inMemoryDerbyDatabase.dropAllObjects();
      inMemoryDerbyDatabase.executeSqlFile("/create_table_policy_version_manager.sql");
      inMemoryDerbyDatabase.executeSqlFile("/insert_table_policy_version_manager.sql");
    
      }
    

奇迹般有效!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top