我想问一下是否可以使用应用程序存储库(基于Spring数据)来填充测试数据。我知道我可以将sql文件与数据一起使用,但有时我需要更动态的东西。我发现编写sql或数据集定义很麻烦(在架构更改的情况下很难维护)。使用应用程序存储库有什么问题吗?已经有所有基本的CRUD操作。请注意,我们正在特别讨论集成测试。
我觉得使用应用程序的一部分进行自我测试有点奇怪。也许我可以创建另一组用于测试上下文的存储库。
答案 0 :(得分:1)
不,使用Spring Data存储库创建测试数据绝对没有错。
我甚至更喜欢这样做,因为它通常可以简化重构。
与在测试中使用JPA一样,您需要记住JPA实现是一个写后缓存。设置测试数据后,您可能希望刷新并清除EntityManager
,这样一来,您就不会从第一级缓存中获得任何真正应来自数据库的信息。而且,这可以确保将数据实际写入数据库,并且会出现问题。
您可能对couple of articles about testing with Hibernate感兴趣。他们不使用Spring Data,但是可以和Spring Data JPA一样使用。
答案 1 :(得分:0)
我建议使用Flyway
来设置数据库,并使用Flyway test extension进行集成测试。
以便您可以执行以下操作:
@ContextConfiguration(locations = {"/context/simple_applicationContext.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
FlywayTestExecutionListener.class})
@Test
@FlywayTest(locationsForMigrate = {"loadmsql"}) // execution once per class
public class MethodTest extends AbstractTestNGSpringContextTests {
@BeforeClass
@FlywayTest(locationsForMigrate = {"loadmsql"}) // execution once per class
public static void beforeClass() {
// maybe some additional things
}
@BeforeMethod
@FlywayTest(locationsForMigrate = {"loadmsql"}) // execution before each test method
public void beforeMethod() {
// maybe before every test method
}
@Test
@FlywayTest(locationsForMigrate = {"loadmsql"}) // as method annotation
public void simpleCountWithoutAny() {
// or just with an annotation above the test method where you need it
}