gpt4 book ai didi

unit-testing - 如何只配置一次 vertx 实例本身并在应用程序代码和测试中使用它?

转载 作者:行者123 更新时间:2023-12-02 13:36:46 25 4
gpt4 key购买 nike

我目前正在将我们的一项 clojure 服务迁移到 vert.x,使用 kotlin 作为主要语言。大多数事情就像一种魅力,但有一个问题我已经挣扎了很长一段时间了。

我们所有的服务都使用 micrometer.ioprometheus收集指标。根据documentation ,积分千分尺很简单:

val vertx = Vertx.vertx(
VertxOptions().setMetricsOptions(
MicrometerMetricsOptions()
.setPrometheusOptions(VertxPrometheusOptions().setEnabled(true))
.setEnabled(true)
)
)

一般来说,这种方法效果很好 - 通过添加单独的路由来收集和公开指标:
router.get("/metrics").handler(PrometheusScrapingHandler.create())

我正在努力解决的问题是,我不知道只定义一次这些与 vert.x 相关的设置( VertxOptions )并在全局范围内发布它们 - 基本上每当一个新的 Vertx创建实例。

这是一个问题,因为目前我必须在三个不同的地方定义这些设置:

1.) 服务器.kt

允许使用我的 IDE 启动服务

2.) 服务器启动器

此类的目的是使用 gradle 从命令行启动服务器。

3.) 集成测试

Vert.x 提供了一个漂亮的 junit5 扩展( VertxExtension ),它自动注入(inject) VertxVertxTestContext test methods 中的实例.缺点是无法配置注入(inject)的 Vertx实例,因为它总是用 default settings 注入(inject)它.

因此,您必须在测试方法中自行连接所有内容:
@Test
@DisplayName("Call prometheus endpoint and verify core metrics are present")
fun callPrometheusEndpoint(testCtx: VertxTestContext) {
val vertx = Vertx.vertx(
VertxOptions().setMetricsOptions(
MicrometerMetricsOptions()
.setPrometheusOptions(VertxPrometheusOptions().setEnabled(true))
.setEnabled(true)
)
)
vertx.deployVerticle(
MyVerticle(),
testCtx.completing()
)
WebClient.create(vertx)
.get(8080, "localhost", "/internal/prometheus")
.`as`(BodyCodec.string())
.send(testCtx.succeeding { resp ->
testCtx.verify {
// assertions to follow...
testCtx.completeNow()
}
})
}

我想知道,是否有任何方法可以定义 VertxOptions仅一次,因此覆盖/补充使用的默认设置,只要 Vertx创建实例?

更新 1

我决定提取一个单独的 Application类以配置 Vertx实例并摆脱 Server.ktServerLauncher.kt .
class Application(
private val profileSetting: String? = System.getenv("ACTIVE_PROFILES"),
private val logger: Logger = LoggerFactory.getLogger(Application::class.java)!!
) {

fun bootstrap() {
val profiles = activeProfiles()

val vertx = bootstrapVertx(profiles)
val configRetriever = bootstrapConfigRetriever(vertx, profiles)

val myVerticle = MyVerticle(configRetriever)

vertx.deployVerticle(myVerticle) { startup ->
if (startup.succeeded()) {
logger.info("Application startup finished")
} else {
logger.error("Application startup failed", startup.cause())
vertx.close()
}
}
}

internal fun activeProfiles(): List<String> {
logger.info("Configured profiles: {}", profileSetting)
return profileSetting
?.let { it.split(',').map { p -> p.trim() }.filter { p -> p.isNotBlank() } }
?: emptyList()
}

internal fun bootstrapVertx(profiles: List<String>): Vertx {
registerModules()
val vertxOptions = VertxOptionsFactory(profiles).create()
return Vertx.vertx(vertxOptions)
}

internal fun bootstrapConfigRetriever(vertx: Vertx, profiles: List<String>): ConfigRetriever {
return ConfigRetrieverFactory(profiles).create(vertx)
}

private fun registerModules() {
Json.mapper.apply { registerKotlinModule() }
Json.prettyMapper.apply { registerKotlinModule() }
}

companion object {
@JvmStatic
fun main(args: Array<String>) = Application().bootstrap()
}
}

我发现没有办法通过配置的 Vertx VertxExtention 的实例尽管。

更新 2

我创建了一个 pull request这解决了在测试中预配置 vertx 实例的问题。

最佳答案

从 Vert.x 3.6.0 开始,你可以把 Vert.x options in a file并使用 -options 加载它们.如果您使用 CLI 或 Launcher类(class)。

当您必须以嵌入模式(例如测试)启动 Vert.x 时,您可以读取文件内容,并创建 VertxOptions来自 JsonObject 的实例.

关于unit-testing - 如何只配置一次 vertx 实例本身并在应用程序代码和测试中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54479117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com