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

Spring Boot-如何通过一个实现BeforeAllCallback的自定义扩展类来设置或重写application.yml中定义的属性?

通京
2023-03-14

我有一个扩展类,它实现BeforeAllCallback来设置类似这样的随机端口。

import org.junit.jupiter.api.extension.ExtensionContext
import java.net.ServerSocket

class CustomExtension : org.junit.jupiter.api.extension.BeforeAllCallback {
    var port: Int? = null

    override fun beforeAll(context: ExtensionContext?) {
        port = getRandomPort()
    }
    
    private fun getRandomPort(): Int {
        ServerSocket(0).use { 
            serverSocket -> return serverSocket.localPort 
        }
    }

}

另外,我在src/test/resources/application.yml中定义了一个属性,如下所示。

app:
  random-port: 8765
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding

@ConstructorBinding
@ConfigurationProperties(prefix = "app")
data class PortProperty(
    val randomPort: Int
)
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest
@ExtendWith(CustomExtension::class)
class RandomPortTest {
}

该用例实际上是使用测试类的AWS DynamoDBLocal库启动本地dynamo db。

共有1个答案

黄朗
2023-03-14

可以在BeforeAll方法中设置app.random-port系统属性。由于系统属性比属性文件具有更高的优先级,application.yml的端口值将被重写:

kotlin prettyprint-override">override fun beforeAll(context: ExtensionContext?) {
    port = getRandomPort()
    System.setProperty("app.random-port", port?.toString())
}
 类似资料:
  • 问题内容: 我正在阅读另一个SO问题,即Swift do-try-catch语法。在他的回答中, rickster 为OP的自定义类创建了扩展。 Konrad77 评论说,这是“保持代码整洁的好方法。” 我尊重他们的知识,这使我相信我在自己的代码中遗漏了一点。 除了为我创建的类创建扩展之外,还有其他好处(除了整洁)还是原因?我可以将相同的功能直接放入类中。如果我是唯一使用该类的人,或者其他人将使用

  • 我正在开发一个应用程序来模拟一些特定问题的2D几何形状。当然,我想在屏幕上绘制该几何图形,让用户实际看到它。 JavaFX有一些2D形状,如矩形、椭圆形等。它也有三次和四次曲线,实现为贝塞尔曲线。搜索自定义形状没有帮助,因为我所找到的只是一些形状元素的例子,如路径,并将它们放在一起绘制自定义形状,如心形或菱形。搜索关于如何通过扩展shape类来实现新形状的信息就更没用了。 我要画的是任意阶任意长的

  • 目前 Mars 支持自定义 xlog 的加密部分和长短连协议加解包部分。需要强调的是想要自定义这些扩展,需要在本地编译 Mars 才可以,编译方法见 Mars Android 接入指南 和 Mars iOS/OS X 接入指南 中的编译部分。切记,在自定义实现时,可以增加函数,但是不能删除头文件中已有的函数,也不能修改头文件中的函数原型。 自定义 xlog 加密 xlog 的具体实现可以参考微信终

  • 问题内容: 作为一个例子,取子域映射。 然后,映射将如下所示: 如果我们想创建自定义的@RequestMapping属性,例如子域。创建这样的映射: 我们应该使用我们自己的实现覆盖定义并覆盖RequestMappingHandlerMapping受保护的方法 (如JIRA所述:“ 允许自定义请求映射条件SPR-7812 ”)。 这样对吗?有人可以提供提示,如何实现此功能吗? 想法1: 正如原始的j

  • 本文:在Google App Engine上管理同一应用程序的多个域和子域,建议在筛选器上解析子域,并将变量分配给ServletRequest头。 那么映射将如下所示: 如果我们想创建自定义的@RequestMapping属性,比如subdomain,例如。要创建如下所示的映射: 也许像这样的类型和方法映射是可能的解决方案? 链接到forum.springsource.com上的相同问题

  • 我用java开发了一个应用程序来执行基本的crud操作,并使用spring和hibernate将其打包为jar文件。然后,我将这个jar文件包含到另一个项目中,并尝试实现crud操作。但由于我在jar文件和实现项目中都使用了会话工厂,所以我面临以下错误。 错误:"错误创建名为'entityManagerFactory'的bean"和"当'hibernate.dialect'未设置时,对Dialec