【问题标题】:Use Spring Data repositories to fill in test data使用 Spring Data 存储库填充测试数据
【发布时间】:2019-03-22 21:03:32
【问题描述】:

我想问一下是否可以使用apps repositories(基于Spring Data)来填写测试数据。我知道我可以将 sql 文件与数据一起使用,但有时我需要一些更动态的东西。我发现编写 sql 或数据集定义很麻烦(并且在架构更改的情况下难以维护)。使用应用程序存储库有什么问题吗?那里已经有所有基本的 CRUD 操作。请注意,我们特别讨论的是集成测试。

我觉得使用应用程序的一部分来测试自己有点奇怪。也许我可以创建另一组存储库以用于测试上下文。

【问题讨论】:

  • 你的问题不是很清楚,也许你想解释的更清楚些。应用程序存储库/动态您真正想要实现的目标。
  • 只需填充数据库进行测试,无需使用普通 sql 或任何其他数据集/xml 文件。
  • 那你已经使用 spring-data-apis 回答了。
  • 我知道问题是这对于集成测试是否可以接受,或者它是否违反了一些最佳实践。
  • 如果您使用 API 来设置客户端将要使用的数据,我会推荐。那将是一个真正的集成测试。 (可能是 REST API 或其他东西)。准确地从用户的角度思考,好像用户正在执行这些操作。

标签: java spring-data-jpa integration-testing test-data


【解决方案1】:

不,使用 Spring Data 存储库创建测试数据绝对没有错。

我什至更喜欢这样做,因为它通常允许更简单的重构。

与在测试中使用 JPA 一样,您需要记住 JPA 实现是一种后写缓存。您可能想在设置测试数据后刷新和清除EntityManager,这样您就不会从一级缓存中获得任何真正应该来自数据库的东西。此外,这可以确保数据实际写入数据库,并且会出现问题。

您可能对couple of articles about testing with Hibernate 感兴趣。他们不使用 Spring Data,但它同样适用于 Spring Data JPA。

【讨论】:

  • 你还会推荐任何模式吗?手动管理刷新或以某种方式将存储库调用包装在单独的事务中?
  • 我用我曾经写过的一些文章的链接更新了答案。
【解决方案2】:

我建议使用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
  }

【讨论】:

  • 也许我的问题不清楚。我想省略使用任何 sql、xml、flyway 迁移文件。我只想调用 userRepository.createUser() 然后调用服务来更新这个用户。然后只需 userRepository.findAll() 并验证用户已更新。 UserRepository 无论如何都会成为应用程序的一部分,所以我想用它来准备/验证数据。
  • 其实flyway支持基于java的迁移,和我需要的比较接近,但是你需要在里面写sql。我认为不可能在这种迁移中调用存储库。它接近Spring test jdbc support
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 2018-11-22
相关资源
最近更新 更多