当前位置: 首页 > 知识库问答 >
问题:

单元测试后的回滚序列

栾和风
2023-03-14

我正在使用spring test运行JUnit测试,我的代码如下所示:

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

    @Autowired
    private MyRepository repository;

    @Before
    public void before() {
       //clean repository
    }

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

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

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

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

我正在使用Spring、Hibernate和HsqlDb

共有1个答案

邵星光
2023-03-14

如果您使用@Transactional调用方法,您将无法进行回滚。您可以做的是使用@After以删除所有数据库,并在@前再次创建它。我认为这不是一个很好的主意,您应该删除这些值以隔离每个测试。我建议您使用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
}
 类似资料:
  • 问题内容: 如何确定unittest方法的顺序?字母或数字前缀是否正确? 要么 问题答案: 您可以通过将sortTestMethodsUsing设置为None来禁用它:http ://docs.python.org/2/library/unittest.html#unittest.TestLoader.sortTestMethodsUsing 对于纯单元测试,您是对的。但是对于组件测试和集成测试…

  • 问题内容: 我正在尝试使用Spring测试实体EJB3。 EJB本身不使用Spring,并且我想使生产JPA配置的重复保持最少(例如,不重复persistence.xml)。 我的单元测试似乎可以正常工作,但是即使我的单元测试应该是事务性的,数据仍会在各种测试方法之间持久存在…… 这是我的实体: 我的单元测试: 和我的appContext.xml: 当我运行测试时,test2失败,因为它找到了两个

  • 如果它没有返回任何东西,是否可能以某种方式测试它是否停止了这个if语句?我的意思是,我想把某种断言,检查“好吧,上下文是空的,所以它在这个返回时停止了”。 当然,问题是类是空的,为什么我想测试这种方法可能会有问题,但我想听听一些可能性。

  • 我试图实现一个单元测试的在与。 我在关注这个链接,它运行良好,但结果为空,当我用浏览器测试我的websocket时,它会发送所需的结果。 让我展示一下我的测试课 } 这是我的< code > WebSocketConfiguration 类 } 这是我从服务器得到的响应 更新: 在下面的答案中添加建议的更改并经过进一步的研究后,我的测试类现在看起来像这样 } 经过这些更改后,我现在可以将堆栈跟踪打

  • 我使用的是Spring Boot 1.5.2.Release,我的服务类注释为 我的单元测试类注释为:

  • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。