当前位置: 首页 > 知识库问答 >
问题:

如何在@SpringBootTest之前添加安装程序并且只运行一次?

段干河
2023-03-14

我有一个docker DB安装方法,它目前位于@BeforeAll中。目前,构造如下

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public DockerConstructorTest{
  @BeforeAll
  public static void setup(){
    ...
    CreateContainer
    ...
  }

  @AfterAll
  public static void done(){
    ...
    Stop & Remove Container
    ...
  }
}

有多个测试类都扩展了这个测试超类,每个测试类将构造一个容器,并在完成后将其删除。因此,maven需要花费大量时间来管理docker。(创建和删除)

我的问题是,是否有更好的方法来处理它

我可能想要实现的理想情况是,这个容器创建

我有一些不完整的想法:

  1. 在SpringBoot主类中添加构造函数触发器,如果它是由Test启动的,则运行Docker容器构造函数。但这也意味着我在主类中添加了一些与测试相关的代码,使它们耦合在一起。个人讨厌这种情况发生
  2. 重写SpringBootTest。压倒一切的问题困扰着我,我是否应该这样做。

请分享你的精彩想法,如果能解决这个问题或部分问题,我将不胜感激。

共有3个答案

乐正远航
2023-03-14

您应该在静态上下文中实例化容器。比如:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public DockerConstructorTest{
    static PostgreSQLContainer<?> postgreSQLContainer =
      new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest"))
          .withDatabaseName("db")
          .withUsername("postgres")
          .withPassword("postgres");

    static {
      postgreSQLContainer.start();
    }
}

这样,扩展该类的所有类都不必重新创建容器。

卓学智
2023-03-14

不确定您的具体情况是什么,但是,我建议您在spring boot中使用TestContainers,有许多可配置的容器,您可以开箱即用。此外,它们解决了您的问题,您可以使用单例容器。https://github.com/testcontainers/testcontainers-spring-boot

这里有一些关于如何将其用于几个类(单例容器)的参考,https://www.testcontainers.org/test_framework_integration/manual_lifecycle_control/

在我们的用例中,我们将Spock/Groovy与TestContainers一起使用,我们的基类大致如下所示。

@SpringBootTest(classes = DonkeyApplication.class)
class AbstractSpringSpec extends Specification {
    @Shared
    Closure cleanupClosure
    @Shared
    boolean setupSpecDone = false

    def setup() {
        if (!setupSpecDone) {
            setupSpecWithSpring()
            setupSpecDone = true
        }
        cleanupClosure = this.&cleanupSpecWithSpring
    }

    def cleanupSpec() {
        cleanupClosure?.run()
    }

    def setupSpecWithSpring() {
        // override this if Spring Beans are needed in setupSpec
    }

    def cleanupSpecWithSpring() {
        // override this if Spring Beans are needed in cleanupSpec
    }
}

参考

希望这个混乱的答案能给你的问题一些答案!

松高歌
2023-03-14

如果使用JUnit5,请参阅以下答案(可能使用自定义扩展,JUnit团队稍后将提供一流的支持)

  • https://stackoverflow.com/a/51556718/6365858
  • https://stackoverflow.com/a/50565085/6365858
 类似资料:
  • 本文向大家介绍Android 安装并运行应用程序,包括了Android 安装并运行应用程序的使用技巧和注意事项,需要的朋友参考一下 示例 要安装APK文件,请使用以下命令: 或如果该应用程序已存在并且我们要重新安装 要卸载应用程序,我们必须指定其软件包 使用以下命令以提供的包名称(或应用程序中的特定活动)启动应用程序: 例如,要启动位智:            

  • 因此,目前我的用户下载一个zipfile,解压缩它,然后运行安装程序。exe-我希望他们只需单击一下即可完成此操作。使用http://www.wikihow.com/Use-7Zip-to-Create-Self-Extracting-excutables我可以制作一个自解压exe,但它实际上并不运行安装程序。 从这个问题 为什么7zip在制作SFX安装程序时会忽略我的InstallPath? 看

  • 我正在Scala中编写一个Spark作业,它读取S3上的parquet文件,执行一些简单的转换,然后将它们保存到DynamoDB实例中。每次运行时,我们都需要在Dynamo中创建一个新的表,所以我编写了一个Lambda函数,它负责表的创建。Spark作业所做的第一件事是生成一个表名,调用我的Lambda函数(将新表名传递给它),等待创建表,然后正常地执行ETL步骤。 但是,看起来我的Lambda函

  • 我有一个带有数据库和rabbitmq用法的小型spring boot应用程序。所以我想用集成测试(H2 apache qpid)进行测试。 正如我的应用程序期望数据库和mq Im使用@BeforeAll启动它一样: 问题是,我的web应用程序在@BeforeAll中定义的数据库/mq之前启动。 组织。springframework。测验上下文朱尼特。木星SpringExtension: Web应用

  • 我试图用自定义脚本设置安装程序变量,但随后注意到媒体向导中的“目录名”和“自定义基本目录”字段不接受安装程序变量。 我还尝试在媒体向导中不使用“自定义基本目录”选项,并在“安装位置”屏幕前使用自定义脚本设置变量,但该屏幕似乎根据媒体向导设置计算安装目录。 上下文:我们构建一个产品和一个测试安装程序。prod版本应该建议在中安装。测试安装程序不请求特权,应该建议在用户主页中安装。 定义了一个编译器变

  • 我正在测试一些与比特币相关的代码,为了测试它,我在docker容器中安装了比特币测试网盒。 我使用这个指南:https://registry.hub.docker.com/u/freewil/bitcoin-testnet-box/ 我没有任何问题地拉和运行码头工人。 但是,我无法编辑其目录中的bitcoin.conf文件,因为我没有安装像NANO这样的编辑器。 我想: 但它不起作用。我该怎么解决