如何在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
相关产品推荐
相关产品推荐

