【问题标题】:@Transaction and repository testing@Transaction 和存储库测试
【发布时间】:2014-04-11 23:59:30
【问题描述】:

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

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

我看到的唯一解决方案是添加@Transactional 注释:

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

可能是我理解错了,前两天开始学Java的。

【问题讨论】:

  • “因为没有提交修改”没看懂
  • 更改未提交到数据库
  • 我还是没听懂你。要测试功能,可以编写一个Junit测试用例[@RunWith(SpringJUnit4ClassRunner.class)],并在@Transactional处标记[默认回滚为真]。
  • @user3168219 您是否希望在测试结束时回滚更改?还是您使用最后被清理的基于内存的数据库?或者您打算如何删除提交的条目?另请注意,这是集成测试,而不是单元测试。你最好把两者分开。
  • 我使用不同的配置进行生产和测试,实际上我使用 H2 数据库进行测试。

标签: java spring spring-data


【解决方案1】:

您不需要提交到数据库的更改,您只需要在同一事务中发出的查询。接下来,您不应该使用与存储数据相同的方式来检索数据。基本上你应该使用普通的 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

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

【讨论】:

  • 谢谢。实际上我使用JpaRepositorysave()而不是saveAndFlush(),所以我需要在测试中手动调用flush
【解决方案2】:

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

【讨论】:

  • 这个问题的答案如何?
猜你喜欢
  • 2016-07-28
  • 2013-01-20
  • 2013-07-31
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多