单元测试 – ScalaMock.模拟一个带参数的类
完全披露:我很嘲笑和嘲笑框架.我正在尝试使用
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) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |