单元测试后的回滚序列

时间:2017-04-19 11:48:19

标签: java hibernate junit spring-test

我使用spring-test运行JUnit测试,我的代码如下:

HttpClient

我想在所有测试之前回滚我的数据库状态。表格回滚,但每次测试都会增加id生成的顺序。

请帮我找到在每次测试前设置序列开始值的方法。

我使用Spring,Hibernate,HsqlDb

1 个答案:

答案 0 :(得分:0)

如果您使用@Transactional调用方法,则无法进行回滚。您可以做的是@After以删除所有数据库,并在@Before中再次创建它。我认为这不是一个好主意,你应该删除这些值以隔离每个测试。我建议您使用H2数据库以便能够在内存中使用,这样您就不必担心ID号。

您必须将此依赖项添加到pom:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.193</version>
</dependency>

.xml中的配置应该是这样的:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.connection.url">jdbc:h2:mem:testDB;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1</property>
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
        <property name="show_sql">false</property>
        <property name="hbm2ddl.auto">create</property>
    </session-factory>
</hibernate-configuration>

当然您应该将其调整到您的系统,但您必须保留该用户名和密码才能成功连接。

如果您不想自动创建表格,可以在连接网址上添加此参数:

INIT=RUNSCRIPT FROM 'classpath:scripts/create.sql

这将在测试之前运行您的脚本。

然后在你的测试中你可以做一些事情链接:

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {})
@Transactional (propagation = Propagation.REQUIRED)
public class MyTest {

    @Autowired
    private MyRepository repository;

    @Test
    public void test_1() {
       //add new entity
    }   

    @Test
    public void test_2() {
      //add new entity
    } 

    @After
    public void tearDown(){
      repository.clean();
    }
}

干净的方法可能是这样的

public void clean(){
    for (T obj: this.findall()) //replacing T for the type if you don't use generics
        session.delete(obj); //your entity manager or session, depending on how you do the queries
}