You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cucumber中运行协程?Kotlin MockServer后台运行求助

在Kotlin+Cucumber中后台启动MockServer的实现方案

1. 先配齐依赖

在build.gradle.kts(或build.gradle)里添加必要依赖:

dependencies {
    // Kotlin协程核心库
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
    // MockServer(版本可按需调整)
    testImplementation("org.mock-server:mockserver-netty:5.15.0")
    // Cucumber Kotlin依赖
    testImplementation("io.cucumber:cucumber-kotlin:7.14.0")
    testImplementation("io.cucumber:cucumber-junit-platform-engine:7.14.0")
}

2. 用协程后台启动MockServer

创建Cucumber钩子类,在测试场景前后管理MockServer的生命周期,确保后台启动不阻塞测试:

import io.cucumber.java.After
import io.cucumber.java.Before
import org.mockserver.integration.ClientAndServer
import kotlinx.coroutines.*

class MockServerHooks {
    private var mockServer: ClientAndServer? = null
    private var serverJob: Job? = null

    @Before
    fun startMockServer() = runBlocking {
        // 用IO调度器在后台启动MockServer,避免阻塞测试流程
        serverJob = launch(Dispatchers.IO) {
            mockServer = ClientAndServer.startClientAndServer(1080) // 指定服务端口
            // MockServer的start方法是阻塞的,会一直停在这里直到服务停止
        }
        // 短暂等待确保服务完全启动(可根据实际启动速度调整时长)
        delay(500)
    }

    @After
    fun stopMockServer() = runBlocking {
        serverJob?.cancelAndJoin() // 取消启动协程并等待结束
        mockServer?.stop() // 停止MockServer释放资源
    }
}

3. 测试步骤中正常使用MockServer

在你的Cucumber步骤定义里,直接调用已启动的MockServer配置预期响应:

import io.cucumber.java.en.Given
import org.mockserver.model.HttpRequest.request
import org.mockserver.model.HttpResponse.response

class ApiSteps {
    @Given("MockServer配置{int}状态码的/test-api响应")
    fun configureMockResponse(statusCode: Int) {
        val mockServer = ClientAndServer.getInstance(1080)
        mockServer.`when`(
            request().withPath("/test-api")
        ).respond(
            response().withStatusCode(statusCode)
        )
    }
}

核心要点说明

  • Dispatchers.IO:启动网络服务属于IO密集型操作,用IO调度器不会占用主线程资源。
  • runBlocking:Cucumber的@Before/@After是同步方法,必须用runBlocking包裹协程代码,确保协程逻辑执行完成后钩子才结束。
  • Job对象:保存启动协程的Job实例,方便在测试结束时精准取消协程,避免服务残留。
  • 启动等待:添加delay(500)是为了规避服务未就绪导致的测试失败,可根据实际情况调整或替换为服务就绪检查逻辑。

内容的提问来源于stack exchange,提问作者CucumberAndCoroutines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:46:02