Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Junit数据库在测试类结束时回滚_Java_Spring_Junit4_Rollback_Spring Test - Fatal编程技术网

Java Spring Junit数据库在测试类结束时回滚

Java Spring Junit数据库在测试类结束时回滚,java,spring,junit4,rollback,spring-test,Java,Spring,Junit4,Rollback,Spring Test,我有很多现有的SpringJUnit测试。 所有这些测试都扩展了一个抽象测试类。 公共类ServiceTest扩展了AbstractServiceTest{ 但是在这个抽象类中,我们重新初始化了数据库,所以它会在每个测试类上重新初始化数据库 @Before @Override public void initGlobal() throws Exception { initDatabase(); ... } 我在问如何在测试类的测试执行结束时对其进行回滚?这样我就可以一次性初始化

我有很多现有的SpringJUnit测试。 所有这些测试都扩展了一个抽象测试类。
公共类ServiceTest扩展了AbstractServiceTest{
但是在这个抽象类中,我们重新初始化了数据库,所以它会在每个测试类上重新初始化数据库

@Before
@Override
public void initGlobal() throws Exception {
    initDatabase();
    ... }

我在问如何在测试类的测试执行结束时对其进行回滚?这样我就可以一次性初始化数据库并回滚每个测试类中的更改

我认为有两个配置文件是更好的选择,一个用于测试,另一个用于开发,在测试配置文件上使用基于内存的数据库,如H2(这是一个很好的例子)并且在您的开发配置文件中使用您的主数据库

@Before
@Override
public void initGlobal() throws Exception {
    initDatabase();
    ... }
运行测试时使用测试配置文件。而不是每次运行测试时回滚或删除数据

如果你想在单元测试中使用真实的数据库,我完全不鼓励你这样做。你可以使用spring测试运行程序来注释你的类和回滚事务

@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(defaultRollback=true)
public class YourTestClass {

    @Test
    @Transactional
    public void myTestMethod() {
        // db will get rolled back at the end of the test
    }
}

删除操作后,没有人可以恢复数据。无论如何,您可以在执行操作之前复制表,并保留一个干净的原始表。我在另一个专用于测试的数据库(postgresql)中运行测试,以测试与DBMS相关的错误。我有一个抽象类,在每个类中重新初始化此测试数据库(@Before)。它可以工作,但测试需要很长时间才能完成测试(因为每次我们都会删除数据库并重新初始化它)。因此,我们的想法是使抽象类具有事务性,并在最后进行回滚,以在不重新初始化的情况下回滚更改it@YounessHARDI我更新了我的答案,我希望它能帮助你