如何在Spring中以编程方式填充测试数据以进行集成测试?
作者:互联网
我正在寻找推荐的方法,以便在使用Spring / Spring Boot的集成测试中以编程方式填充测试数据.我正在使用HSQLDB(内存).
可以在春季为集成测试执行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());
}
}
当单独执行此示例的每个Test时,它运行良好.但是当它们一起运行时,第二个(getByIsbn)将失败.显然@Before是在此处使用错误的注释,因为书籍将被插入两次.
如何执行仅执行一次的数据库设置?
解决方法:
用@Transactional(在类级别)替换@IntegrationTest应该可以解决您的问题.
推理:
> @IntegrationTest启动您的整个Spring Boot应用程序,但这似乎对您的情况有些过分.
> @Transactional将使您的测试在测试管理的事务中执行,该事务将在测试完成后回滚;在@Before方法中执行的代码将在测试管理的事务中执行.
问候,
Sam(Spring TestContext Framework的作者)
标签:spring-boot,spring-data,spring-test,spring 来源: https://codeday.me/bug/20191119/2033727.html