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

