gpt4 book ai didi

java - 在每个测试用例后清除内存数据库

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:54:38 26 4
gpt4 key购买 nike

我正在使用 hsqldb 测试 Java 中的一些数据访问层。我有大约 100 个测试用例。我创建了一个内存数据库,然后在表中插入一些值,这样我的测试用例就可以加载它,但问题是每个测试用例我都需要清除内存数据库,只有值而不是表。

有没有可能,一件事是我需要从表中手动删除行,还有其他我可以使用的东西吗。

谢谢

最佳答案

如果您使用 DbUnit在单元测试中,您可以指定 DbUnit 在每次测试之前执行一次清理和插入操作,以确保数据库的内容在每次测试之前都处于有效状态。这可以通过类似于以下的方式完成:

@Before
public void setUp() throws Exception
{
logger.info("Performing the setup of test {}", testName.getMethodName());
IDatabaseConnection connection = null;
try
{
connection = getConnection();
IDataSet dataSet = getDataSet();
//The following line cleans up all DbUnit recognized tables and inserts and test data before every test.
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
}
finally
{
// Closes the connection as the persistence layer gets it's connection from elsewhere
connection.close();
}
}

请注意,始终建议在 @Before 设置方法中执行任何设置 Activity ,而不是在 @After 拆卸方法中。后者表示您正在以正在测试的方法中创建新的数据库对象,恕我直言,这种方法并不容易用于可测试的行为。此外,如果您在测试后进行清理,以确保第二个测试正确运行,那么任何此类清理实际上都是第二个测试设置的一部分,而不是第一个测试的拆卸。

使用 DbUnit 的替代方法是在 @Before 设置方法中启动一个新事务,并在 @After 拆卸方法中将其回滚。这将取决于您的数据访问层的编写方式。

如果您的数据访问层接受Connection 对象,那么您的设置例程应该创建它们,并关闭自动提交。此外,假设您的数据访问层不会调用 Connection.commit。假设是前者,您可以在拆卸方法中使用 Connection.rollback() 回滚事务。

关于事务控制,下面的代码片段演示了如何使用 JPA 来做到这一点:

@Before
public void setUp() throws Exception
{
logger.info("Performing the setup of test {}", testName.getMethodName());
em = emf.createEntityManager();
// Starts the transaction before every test
em.getTransaction.begin();
}

@After
public void tearDown() throws Exception
{
logger.info("Performing the teardown of test {}", testName.getMethodName());
if (em != null)
{
// Rolls back the transaction after every test
em.getTransaction().rollback();
em.close();
}
}

对于其他 ORM 框架甚至您的自定义持久层(如果您已经编写了一个),必须采用类似的方法。

关于java - 在每个测试用例后清除内存数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6936845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com