scala中的单元测试[关闭]

Posted

技术标签:

【中文标题】scala中的单元测试[关闭]【英文标题】:Unit test in scala [closed] 【发布时间】:2018-11-27 06:30:47 【问题描述】:
class HttpUtils
    def get(userId: String, organization: String, url: String) = 
    
        Logger.debug("Request - GET :: " + url)
        val wsClient = AhcWSClient()
        wsClient.url(url).withHttpHeaders("userId"-> userId,"organization"-> organization).get()
        .andThen  case _ => wsClient.close() 
        .andThen  case _ => system.terminate() 
    

class MetamodelClient @Inject() (httpUtils: HttpUtils)(隐式 defaultExecutionContext: ExecutionContext)

隐式验证格式 = org.json4s.DefaultFormats

def getDBDetails(userId: String, organization: String, metamodelUrl: String, model: String) = httpUtils.get(userId, organization, metamodelUrl + "/models/" + model + "/modelsets").map 回复 => 响应状态匹配 case Status.OK => parse(resp.body).extract[List[DatabaseDetails]] case _ => handleError(resp.status)

无法为 getDBDetails 方法编写测试用例程序。谁能帮帮我。

【问题讨论】:

【参考方案1】:

您应该考虑为什么要为此代码编写测试,这将有助于指导您如何

参见例如https://dzone.com/articles/top-8-benefits-of-unit-testing

这里有许多问题使测试变得如此困难:

    该方法对“get()”的结果不做任何事情 如果不涉及远程系统,则无法验证此处的请求是否正确。我们希望显示的 get 调用是正确的,但是如果不连接到远程 API 并尝试它,就无法测试它是否符合您的期望。这超出了单元测试的范围。 该方法有很大的副作用,包括关闭 ActorSystem 该方法与AhcWSClient类紧密耦合

我会考虑注入一个 WS 客户端工厂来修复 (4)。

我会考虑重构您的关闭过程以将其与应用程序逻辑分开,以修复 (3)。

我不会测试这段代码,因为 (1) & (2)。没有办法通过单元测试来验证它是否正确。

如果您确实坚持对此进行测试,也许是因为您强制执行了不灵活的 100% 覆盖政策,我会做更多类似的事情:

class SomethingFetcher(clientFactory: () => AhcWSClient, somethingApiUrl: String) 

  def get(userId: String, organization: String): Something = 
    val wsClient = AhcWSClient()
    wsClient.url(url).withHttpHeaders("userId"-> userId,"organization"-> organization).get()
    .andThen  case _ => wsClient.close() 
  


...

class SomethingFetcherSpec 
  "SomethingFetcher" should "invoke GET on the specified URL" in 
    // arrange
    val mockWsClient = ... // this will be a bit fiddly
    val wsClientFactory = () => mockWsClient 
    val fetcher = SomethingFetcher(wsClientFactory, "http://example.com/something")

    // act
    val ignored = fetcher.get("test uid", "test oid")

    // assert
    verify(mockWsClient).get("http://example.com/something")
  

【讨论】:

以上是关于scala中的单元测试[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 为使用数据库连接扩展特征/类的对象/单例编写单元测试

TypeScript 中的单元测试 [关闭]

如何在 sbt 中运行 java/scala 单元测试

Spark程序进行单元测试-使用scala

Spark scala 模拟 spark.implicits 用于单元测试

更改 Scala 单元测试的 Flyway 资源位置