【问题标题】:Should I use @Transactional or @Rollback for DAO test classes?我应该对 DAO 测试类使用 @Transactional 还是 @Rollback?
【发布时间】:2019-05-02 08:24:56
【问题描述】:

我的数据库有一个 dao 层。现在,我正在为它编写一些集成测试。我想知道是否应该在测试类中使用 @Transactional@Rollback,因为它们都会恢复对数据库的更改。哪一个是好的做法,在什么条件下

我尝试使用它们,它们都适用于我的情况。我的班级中有一个 @Before 注释方法。

@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(replace = NONE)
@DataJpaTest
// @Transactional or @Rollback?
public class TestDao {

    @Autowired
    private ConcreteDao concreteDao;

    @Before
    public void cleanUp(){ . . . }

    @Test
    public void testSaveAllEntries(){ . . . }

    // and other tests
}

【问题讨论】:

标签: java spring testing junit dao


【解决方案1】:

同意@michael 根本不要让你的测试@transactional(但你的服务层)这意味着通过测试调用的所有服务层/持久层方法都将启动它们自己的事务(你让它们成为事务性的,没有你?)并在提交时刷新更改。因此,您一定会注意到刷新时是否出现问题,并且很可能在一段时间后,数据库中充满了垃圾测试数据

【讨论】:

  • 那么,我应该从类中删除@Transactional 注释并按原样运行它吗?我的 dao 方法不是事务性的,我知道应该在服务层(针对特定方法)创建事务,对吗?
  • '是的,您应该在服务层而不是测试上处理这些事情。在官方文档中也提到了它。默认情况下,测试事务会在测试完成后自动回滚;但是,事务提交和回滚行为可以通过 @Commit@Rollback annotations 以声明方式配置
【解决方案2】:

使用数据库运行测试通常会通过集成测试来完成。为了简单起见,您可以使用所需的方言设置 h2。准备数据库结构并运行您需要的服务调用。断言预期结果并将测试方法标记为脏上下文(作为注释),或在每次测试时重新设置数据库,否则保存的测试结果可能会影响另一个测试。通过这种方式,您还可以测试服务的事务处理。

向您的测试添加事务性将改变您的业务逻辑行为。将它们排除在您的测试之外。

【讨论】:

    猜你喜欢
    • 2011-06-22
    • 2012-08-23
    • 2011-03-14
    • 2023-03-11
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多