如果您使用 @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>
当然,您应该调整它以适应您的系统,但您必须保留该用户名和密码才能成功连接。
如果您不想自动创建表格,可以在连接 URL 上添加此参数:
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
}