Scala:如何使用mock/stub对一个调用内部非公开API的函数进行单元测试?

l3zydbqr  于 2023-08-05  发布在  Scala
关注(0)|答案(1)|浏览(129)

我有一个函数,它调用了一个API,该API不是外部公开的,而是与该函数存在于相同的服务网格中。
让我们来说说下面的事情。

func internalApiCall(payload: String): Unit = {
    request = buildRequestForApi(payload)
    response = (new URL(service.namespace.svc.cluster.local:8080/path)).openConnection().asInstanceOf[httpURLConnection]
    assert using response code
}

字符串
我需要为这个写单元测试,我该怎么做?是否可以通过mocking来实现?如果可以,我们如何进行mock,因为它调用的API是用不同的语言(Golang)编写的。
我需要模拟的服务,但它不是外部暴露,需要解决这个问题。

yqkkidmi

yqkkidmi1#

您需要重写函数,以便使用“client”示例而不是直接使用URL进行调用。“也许是这样的:

trait InternalApiClient { 
   def getStuff(endpoint: String, request: Request): Response
}
object InternalApiClient extends InternalApiClient {
   def getStuff(endpoint: String, request: Request) = {
     val con = new URL(endpoint)
       .openConnection
       .asInstanceOf[httpURLConnection]
     send(con, request)
     receive(con)
   }
}

class MyClass(client: InternalApiClient = InternalApiClient) {
   def internalApiCall(payload: String) = {
    val request = buildRequestForApi(payload)
    val response =  client
       .getStuff("service.namespace.svc.cluster.local:8080/path", request)
    doStuffWithResponse(response)
  }
}

字符串
然后,您可以撰写公寓测试,如下所示:

val client = mock[InternalApiClient]
val testMe = new MyClass(client)
when(client.getStuff(any, any)).thenReturn(someResponse)

testMe.internalApiCall("some payload")

verify(client)
  .getStuff("service.namespace.svc.cluster.local:8080/path", expectedRequest)

相关问题