@Transaction和存储库测试

时间:2014-04-11 23:59:31

标签: java spring spring-data

我已经看到@Transactional最好放在服务层,但问题是我无法正确测试我的存储库,因为没有提交更改。

在测试存储库save()方法时,我想使用find()来查看实体是否已正确保存,但因为save()更改未提交到数据库,{{1} }返回null。

我看到的唯一解决方案是添加find()注释:

  • 在存储库@Transactional方法
  • save()方法=>但IMO这是错误的,因为它修改了行为

也许我误解了一些事情,两天前我开始学习Java。

2 个答案:

答案 0 :(得分:0)

您不需要提交到数据库的更改,只需要在同一事务中发出的查询。接下来,您不应该使用相同的方法来存储数据以检索数据。基本上你应该使用普通的jdbc来测试它是否被添加。

public class TestClass extends AbstractTransactionalSpringJUnit4ContextTests {

    private TestRepository repo; 

 @Test
 public void testSave() {
    int rowCount = countRowsInTable("your-table-name");
    repo.save(yourEntity);
    repo.flush(); 
    int rowCountAfter = countRowsInTable("your-table-name");
    assertTrue(rowCountAfter - rowCount == 1); // Or whatever you like to verify the row was added 
 }

注意:如果您不扩展JpaRepository,则不会使用flush方法,而是可以在测试用例中注入EntityManager并在那里调用flush。< / p>

您可以使用jdbcTemplate中的AbstractTransactionalJunit4SpringContextTests来检索新添加的行,并与您预期的行进行比较,而不是仅测试行数。

答案 1 :(得分:-3)

这就是为什么在编写生产代码时通过编写单元测试来开始测试的原因。但是,就在两天前你开始学习Java时,你真的不应该立即进入事务管理。首先学习基础知识和设计。