标签:spring-boot spring-data spring-test 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。