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

Scala中Mock requests.Session的post方法:获取参数并返回指定响应

解决方案

要实现你需要的Mock逻辑,得用Mockito的**应答器(Answer)**来捕获请求参数并动态返回响应,直接给session.post.apply赋值不是Mockito的正确用法。以下是完整实现:

import org.mockito.MockitoSugar.{mock, when, any}
import org.mockito.invocation.InvocationOnMock
import requests.Session

object TestRunnerSpec {
  val session = mock[Session]

  val imsExp = "mock-imsExp"
  val clientId = "client-id"
  val clientSecret = "client-secret"
  val token = "jwt-token"

  // 存根post方法,自定义应答逻辑
  when(session.post(
    url = s"$imsExp/ims/exchange/jwt/",
    headers = any[Map[String, String]],
    params = any[Map[String, String]]
  )).thenAnswer((invocation: InvocationOnMock) => {
    // 1. 从调用中提取请求参数
    val headers = invocation.getArgument[Map[String, String]](1)
    val params = invocation.getArgument[Map[String, String]](2)

    // 示例:获取Content-Type头和client_id参数
    val contentType = headers.get("Content-Type")
    val reqClientId = params.get("client_id")

    // 2. 根据参数返回对应响应
    contentType match {
      case Some("application/x-www-form-urlencoded") if reqClientId.contains(clientId) =>
        // 返回符合预期的Mock响应,模拟requests.Response结构
        mock[requests.Response] { res =>
          when(res.statusCode).thenReturn(200)
          when(res.text).thenReturn("""{"access_token": "mock-access-token"}""")
        }
      case _ =>
        // 参数不符合时返回错误响应
        mock[requests.Response] { res =>
          when(res.statusCode).thenReturn(400)
          when(res.text).thenReturn("""{"error": "invalid_request"}""")
        }
    }
  })
}

关键说明:

  • 捕获请求参数:通过InvocationOnMock.getArgument(index)获取传入的参数,index对应方法参数的位置(url是第0位,headers是第1位,params是第2位)。
  • 动态返回响应:用thenAnswer替代固定返回值的thenReturn,在应答逻辑里根据参数判断返回不同的Mock响应。
  • 参数匹配:用any[Map[String, String]]匹配任意headers/params,确保存根能覆盖符合url的所有请求;如果需要精确匹配特定参数,可换成eq(expectedMap)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:35:25