我已经看到@Transactional
最好放在服务层,但问题是我无法正确测试我的存储库,因为没有提交更改。
在测试存储库save()
方法时,我想使用find()
来查看实体是否已正确保存,但因为save()
更改未提交到数据库,{{1} }返回null。
我看到的唯一解决方案是添加find()
注释:
@Transactional
方法save()
方法=>但IMO这是错误的,因为它修改了行为也许我误解了一些事情,两天前我开始学习Java。
答案 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时,你真的不应该立即进入事务管理。首先学习基础知识和设计。