在静态方法中使用 Spring 存储库来设置测试数据

Using Spring repository in static methods for setting up test data

为了为我的 Spring 启动集成测试设置测试数据,我想创建一些助手 类 和使用存储库填充数据的方法。

这是一个例子:

@Component
public class TestUtils {

    private static TemplateRepository templateRepository;

    @Autowired
    public TestUtils(TemplateRepository templateRepository) {
        TestUtils.templateRepository = templateRepository;
    }

    public static void createTemplates() {
        Template template = Template.builder()
                .content("some content")
                .build();

        templateRepository.save(template);
    }
}

由于缺乏经验,我无法判断这种做法是否可行。将存储库注入 static 是否“安全”?或者是否有更好的方法来设置测试数据?

我使用 TestContainers 和 Flyway。 您可以制作 SQL 脚本并使用 @Sql 注释测试方法,并提供一个 .sql 文件 and/or 语句为 运行。 您可以将这些 .sql 文件存储在 test/resources 文件夹中。

Loading Initial Test Data

在文档中有一个很好解释的初始化数据的过程。我建议你参考下面

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization

您只需在预定义的 sql 文件中维护插入语句。

不要使用 static。如果您想使用 Java 初始化存储库中的数据,只需在您的测试中这样做即可。

如果您需要在不同的存储库中创建一些东西,您可以做的是创建一个专用组件:

@Component
public class DatabaseInitializer {

  private final TemplateRepository templateRepository;
  private final MyOtherRepository myOtherRepository;

 // Add constructor here

  public void createInitialData() {
    // Use repositories to persist some data
  }
@ExtendWith(SpringExtension.class)
@Import(DatabaseInitializer.class)
class MyTest {
  @Autowired
  private DatabaseInitializer initDb;

  @Test
  void myTest() {
    initDb.createInitialData(); // Or put this in a `@Before..` method
    // actual test here
  }
}