gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:06:19 25 4
gpt4 key购买 nike

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

有可能在 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是这里使用的错误注释,因为书籍将被插入两次。

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

最佳答案

更换 @IntegrationTest@Transactional (在类里面)应该可以解决您的问题。
推理:

  • @IntegrationTest启动您的整个 Spring Boot 应用程序,但这对于您的场景来说似乎有点过分。
  • @Transactional将导致您的测试在测试完成后回滚的测试管理事务中执行;在 @Before 中执行的代码方法将在测试管理的事务中执行。
  • 关于spring - 如何以编程方式为 Spring 中的集成测试填充测试数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004139/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com