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

如何以编程方式为Spring中的集成测试填充测试数据?

司徒瀚
2023-03-14

我正在寻找使用spring/Spring Boot在集成测试中以编程方式填充测试数据的推荐方法。我正在使用HSQLDB(inmemory)。

在spring中执行SQL脚本进行集成测试的可能性如下:

@Test
@Sql({"/test-schema.sql", "/test-user-data.sql"})
public void userTest {
    // execute code that relies on the test schema and test data
}

与编写SQL脚本不同,我希望在一个集成测试中以编程方式插入多个测试方法的数据,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = BookstoreApp.class)
@IntegrationTest
public class BookRepositoryTest {
    @Autowired
    private BookRepository bookRepository;

    @Before // not working
    public void setUp() throws Exception {
        bookRepository.save(new Book("Donald Duck 1", "Walt Disney", "0-14-020652-3"));
        bookRepository.save(new Book("Donald Duck 2", "Walt Disney", "0-14-020652-4"));
        bookRepository.save(new Book("Micky Mouse", "Walt Disney", "0-14-020652-5"));
    }

    @Test
    public void findByTitle() {
        List<Book> books = bookRepository.findByTitle("Duck");
        Assert.assertEquals(2, books.size());
    }

    @Test
    public void getByIsbn() {
        Book book = bookRepository.getByIsbn("0-14-020652-4");
        Assert.assertEquals("0-14-020652-4", book.getIsbn());
        Assert.assertEquals("Donald Duck 2", book.getTitle());
    }

}

这个例子的每个测试在单独执行时都运行得很好。但是第二个(getByIsbn)在一起运行时会失败。因此,这里使用@before显然是错误的注释,因为图书将被插入两次。

如何强制只执行一次的数据库设置?

共有1个答案

宣星光
2023-03-14

@transaction替换@integrationtest(在类级别)可能会解决问题。

推理:

  1. @integrationtest启动整个Spring Boot应用程序,但对于您的场景来说,这似乎有些过头了。
  2. @transaction将导致测试在测试管理的事务中执行,该事务将在测试完成后回滚;在@before方法中执行的代码将在测试管理的事务中执行。
 类似资料:
  • 英文原文:http://emberjs.com/guides/testing/integration/ 集成测试通常用来测试应用中得重要工作流。集成测试用来模拟用户交互和确认交互结果。 设置 为了对Ember应用进行集成测试,需要在测试框架中运行应用。首先需要将根元素(root element)设置为任意一个已知将存在的元素。如果根元素在测试运行时可见的话,这对测试驱动开发非常有用,带来的帮助非常

  • 问题内容: 我有一个要测试的函数,和一组预期的输入/输出对: 我希望这些输入/输出对中的每一个都可以用自己的方法进行测试。那可能吗? 这是我想要的,但是将每个输入/输出对强制进行单个测试: (此外,我是否真的想将in的定义放在?) 更新: 尝试 doublep 的建议: 这是行不通的。运行0个测试。我是否对示例进行了错误的修改? 问题答案: 未经测试: 我猜如果经常使用它,可以使用实用程序功能和/

  • 问题内容: 我已经看到这个问题问过其他平台/语言-有什么想法吗?我想做类似的事情: 我希望能够在调试时切换键盘输入作为脚本的开始,这样我就可以花点时间启动chrome来监听我的节点检查器端口。 ***快速更新-我猜我实际上可以使用“ process.argv”来检测–debug是否传入。这是最佳/正确的方法吗? 问题答案: 在调试模式下运行时,NodeJS创建一个全局对象: 因此,可能的解决方案是

  • 问题内容: 我有一个Java方法,可在Mongo集合的两个字段上创建索引。我应该获取集合的索引信息,然后检查索引的名称和字段是否正确。为此编写集成测试的最干净方法是什么?使用自定义的Hamcrest匹配器查看索引是否在集合中是否有意义? 问题答案: 在春天 使用,您可以获取的列表,代表MongoDB集合的索引。由于这是一个常规列表,因此您可以结合使用和进行断言: 如果您觉得这太难以理解或不方便使用

  • 主要内容:1. 项目依赖,2. Spring组件,3. TestNG + Spring在本教程中,我们将演示如何使用TestNG测试Spring的组件。 使用的工具 : TestNG 6.8.7 Spring 3.2.2.RELEASE Maven 3 Eclipse IDE 1. 项目依赖 为了演示,首先创建一个名称为:TestngSpringIntegration 的 Maven 项目。 要将Spring与TestNG集成,您需要包依懒,添加以下内容: 创建文件:pom.xml

  • 我用的是Spring靴。我的数据库属性存在于ApplicationItest.properties文件中。 如何做这两个测试?我必须使用的正确注释是什么?有人能举个例子吗?