加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

单元测试 – ScalaMock.模拟一个带参数的类

发布时间:2020-12-16 18:35:18 所属栏目:安全 来源:网络整理
导读:完全披露:我很嘲笑和嘲笑框架.我正在尝试使用 ScalaMock,因为它似乎是与ScalaTest一起使用的“默认”模拟框架,但我很乐意使用与ScalaTest兼容的任何其他框架. 问题:我在Scala中写了一个与套接字对话的类.该类有一个类型参数,它与哪个套接字进行通信,其中一
完全披露:我很嘲笑和嘲笑框架.我正在尝试使用 ScalaMock,因为它似乎是与ScalaTest一起使用的“默认”模拟框架,但我很乐意使用与ScalaTest兼容的任何其他框架.

问题:我在Scala中写了一个与套接字对话的类.该类有一个类型参数,它与哪个套接字进行通信,其中一个参数是用于创建该类型套接字的工厂.它有签名:

class XScanner[T <: SocketClient](
  confPath: String = "/etc/default/configPath",socketClientFactory: String => T
) extends ScannerBase(path)

我希望能够通过提供一个模拟SocketClient为这个类编写单元测试,所以我的测试代码不必连接到一个真正的套接字,但我无法解决如何使用ScalaMock这样做.

我的测试代码如下所示:

val t = new XScanner[SocketClient](confPath,(s: String) => mock[SocketClient])

很明显,这不会编译,因为SocketClient期望一个套接字的路径作为参数,但我不能调用mock [SocketClient(s)],因为那不是一个类型,我不能调用mock [SocketClient](s)因为mock不会将传递给它的类型的参数作为它自己的参数.

那么如何编写一个模拟SocketClient工厂来传递给我的Scanner呢?我甚至无法弄清楚如何模拟一个带参数的类!

解决方法

洞察力是你需要模拟的是socketClientFactory.然后将其设置为返回模拟SocketClient.

鉴于:

trait SocketClient {
  def frobnicate(): Unit
}

class ScannerBase(path: String)

class XScanner[T <: SocketClient](
  confPath: String = "/etc/default/configPath",socketClientFactory: String => T
) extends ScannerBase(confPath) {
  val socket = socketClientFactory("Some Socket Name")
  socket.frobnicate
}

(旁注 – 您永远不能使用confPath的默认值,因为socketClientFactory没有默认值).

那么这应该让你开始(这与Scala 2.9.x和ScalaMock2 – 2.10.x与ScalaMock3略有不同,但不是很多):

import org.scalatest.FunSuite
import org.scalamock.scalatest.MockFactory
import org.scalamock.generated.GeneratedMockFactory

class ScannerTest extends FunSuite with MockFactory with GeneratedMockFactory {

  test("scanner") {
    val mockFactory = mockFunction[String,SocketClient]
    val mockClient = mock[SocketClient]
    mockFactory.expects("Some Socket Name").returning(mockClient)
    mockClient.expects.frobnicate
    val scanner = new XScanner("path/to/config",mockFactory)
  }
}

为了完整性,这里是Scala 2.10.0和ScalaMock3中的相同测试:

import org.scalatest.FunSuite
import org.scalamock.scalatest.MockFactory

class ScannerTest extends FunSuite with MockFactory {

  test("scanner") {
    val mockFactory = mockFunction[String,SocketClient]
    val mockClient = mock[SocketClient]
    mockFactory.expects("Some Socket Name").returning(mockClient)
    (mockClient.frobnicate _).expects()
    val scanner = new XScanner("path/to/config",mockFactory)
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读