2015-04-25 47 views
1

我已经使用休眠功能将数据库功能添加到内存中的系统,直到此时。当所有数据都是内存时,我可以使用Junit在每次测试后恢复原始数据。 有没有一种方法可以实现与新增的休眠相同的结果? “同样的结果”我的意思是从数据库处于初始状态开始,测试哪些可以改变数据库,并将数据库恢复到原始状态。在添加休眠数据库后进行单元测试

到现在为止,我的想法是:

  1. 在内存数据库(这是一个休眠功能),但不会允许我用我的实际数据。
  2. 向我添加“测试标志”如果设置,DOA不会提交更改。

我相信有更好的解决方案,但我还没有找到更好的东西。

回答

0

我想我们应该明确单元测试的定义。单元测试只能在应用程序中测试一个小单元(一种公共方法)。

假设您有一个使用Hibernate与数据库进行交互的DAO层。现在Hibernate使用需要数据源的SessionFactory。单元测试的数据源不应该与您的生产应用程序的数据源相同。

这个想法是定义一个测试数据源,并使用内存数据库(hsqldb或任何其他)。对于每个测试用例,您都可以使用测试数据源对内存数据库执行一些查询,并在执行单元测试后清除它。对于每个单元测试,您应该执行查询,以便为特定测试完成测试数据设置。

对于例如:如果你想测试如下: 1)创建帐户 2)更新帐户 3)删除帐户

然后有三个测试场景,并可以有蜂多个单元测试可以为每个的情况。

现在在执行创建帐户测试之前,重要的是数据库没有此帐户。然后调用DAO中的createAccount方法来测试它。无需验证结果是否在数据库中。只需检查您的方法的返回,并且如果它与创建成功的帐户时的预期相同,那么您的测试用例应该通过。

对于更新帐户,您的设置方法应该通过查询插入一个帐户,然后您必须在此帐户ID中调用DAO中的updateAccount等。

请坚持单元测试的定义,不要一次性使用它来测试多个功能。

希望这会有所帮助。

+0

首先感谢您的答案,我不确定我的问题的哪一部分给人的印象是我使用单元测试来获得更多的功能,但我向你保证事实并非如此。我的意思是我已经有很多已经写好的单元测试,我正试图找到一种方法来修改它们,所以它们不会损害数据。 我也需要这样的集成测试,对于某些测试,我更愿意使用我现有的数据而不是使用空白内存数据库并自行填充,这就是为什么我要求使用我的原始数据库和恢复的方法它。 – Shperb

0

你可以在每次测试之前启动数据库事务:

@PersistenceContext 
private EntityManager em; 

@Before 
public void init() { 
    em.getTransaction().begin(); 
} 

@After 
public void destroy() { 
    em.getTransaction().rollback(); 
} 

这样,每个测试有在测试开始之前运行的交易,该交易被轧在测试结束后回来,所以你总是放弃所有改变当前的测试。

+0

,可以说我想添加用户 - 添加用户方法创建一个用户实例并调用UserDAO来获取会话,开始事务,添加新用户,提交更改并关闭会话。所以我不认为我可以应用你的解决方案,因为提交是在方法中完成的。 – Shperb

+0

如果您正在进行手动交易和会话管理,那么您确实赢了;无法使用此解决方案。如果您使用Spring或Java EE,以便您只使用@Transactional标记您的服务方法,这将是一个有效的选择。 –

+0

你认为在休眠的基础上使用Spring还是Java EE更好?无论如何,我会研究它,但只是一个动机,我还能通过使用这些工具获得什么? – Shperb