我使用spring-test运行JUnit测试,我的代码如下:
HttpClient
我想在所有测试之前回滚我的数据库状态。表格回滚,但每次测试都会增加id生成的顺序。
请帮我找到在每次测试前设置序列开始值的方法。
我使用Spring,Hibernate,HsqlDb
答案 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
}