我应该对DAO测试类使用@Transactional或@Rollback吗?

时间:2019-05-02 08:24:57

标签: java spring testing junit dao

我的数据库有一个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
}

2 个答案:

答案 0 :(得分:0)

同意@michael根本不进行测试@transactional(但要进行服务层),这意味着通过测试调用的所有服务层/持久层方法都将启动其自身的事务(您使它们成为事务性的,您?),并在提交时清除更改。因此,您一定会注意到是否有某些东西在冲洗时炸毁,并且很可能在一段时间后会出现一个充满垃圾测试数据的数据库

答案 1 :(得分:0)

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

将事务性添加到测试中将改变您的业务逻辑行为。将这些内容排除在测试之外。