Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Scala中模拟带有函数参数的方法?

如何在Scala中模拟带有函数参数的方法?
EN

Stack Overflow用户
提问于 2010-01-28 03:05:48
回答 3查看 14.6K关注 0票数 23

我正在尝试模拟一个接受按名称调用参数的方法调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.scalatest.WordSpec
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito._
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner

trait Collaborator {
   def doSomething(t: => Thing)
}

trait Thing

@RunWith(classOf[JUnitRunner])
class Test extends WordSpec with MockitoSugar {
   "The subject under test" should {
      "call the collaborator" in {
         // setup
         val m = mock[Collaborator]
         val t = mock[Thing]

         // test code: this would actually be invoked by the SUT
         m.doSomething(t)

         // verify the call
         verify(m).doSomething(t)
      }
   }
}

我主要对Mockito感兴趣,因为我正在使用Mockito,但我很有兴趣看看是否有任何主要的模拟框架能够进行这种测试。verify行上的测试在运行时失败,并显示如下错误

参数不同!Test$$anonfun$1$$anonfun$apply$1.apply(Test.scala:27):collaborator.doSomething( ($anonfun$apply$3) );在Test$$anonfun$1$$anonfun$apply$1.apply(Test.scala:24)实际调用时的->具有不同的参数: collaborator.doSomething( ($anonfun$apply$2) );在Test$$anonfun$1$$anonfun$apply$1.apply(Test.scala:24)

处的collaborator.doSomething

如果我没弄错的话,编译器隐式地将t包装在一个返回t的空值函数中。然后,模拟框架将该函数与测试代码中生成的函数进行比较,这是等效的,但不是equals()

我的例子是这个问题的一个相对简单的版本,但我认为这对于任何高阶函数都是一个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-28 23:08:34

这看起来很丑陋,但希望它能帮助您找到好的解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito._

trait Collaborator {
   def doSomething(t: => Thing)
}

trait Thing

new MockitoSugar {
     // setup
     val m = mock[Collaborator]
     val t = mock[Thing]

     m.doSomething(t)

     classOf[Collaborator].getMethod("doSomething", classOf[Function0[_]]).invoke(
        verify(m), 
        new Function0[Thing] { 
            def apply() = null
            override def equals(o: Any): Boolean = t == o.asInstanceOf[Function0[Thing]].apply() 
      })
}
票数 10
EN

Stack Overflow用户

发布于 2013-06-03 02:06:48

你可以试试specs2。在specs2中,我们“劫持”了Mockito Invocation类来解决byname参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trait ByName { def call(i: =>Int) = i }
val byname = mock[ByName]

byname.call(10)
there was one(byname).call(10)
票数 2
EN

Stack Overflow用户

发布于 2010-02-01 10:38:48

这个问题似乎是特定于按名称调用的,因为在常规的高阶函数中,您可以匹配显式的FunctionX对象:

verify(collaborator).somethingElse(any(Function2String,的事情)

在按名称的情况下,将参数包装到Function0中是隐式完成的,Alexey的答案显示了如何使用显式参数调用mock。

您可以编写类似于您自己的验证的代码,它将应用由mockito捕获的参数。

Mockito内部记录调用和它们的参数,例如:http://code.google.com/p/mockito/source/browse/trunk/src/org/mockito/internal/matchers/CapturingMatcher.java

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2152019

复制
相关文章
Scala中的方法与函数
封装是计算机编程语言中最基本但也十分经典的思想(更严谨地说封装是面向对象设计中的一种思想),例如将一段频繁用到的逻辑写成一个函数的过程,其背后蕴含的其实就是封装的思想。与众多编程语言类似,Scala中也提供了方法和函数的功能,但在具体使用上又有很多特别之处,甚至一定程度上可以彰显Scala的设计理念。
luanhz
2021/03/04
1K0
Scala中的方法与函数
JavaScript 函数中带有参数并返回值的函数
document.getElementById("demo").innerHTML=myFunction(4,3);
好派笔记
2021/09/18
5.7K0
git命令中带有特殊符号如@
使用带用户密码clone的方式: git clone https://username:password@remote 当username和password中含有特殊符号会导致出错, 因为为http的请求,所以需要将特殊符号encode成url格式的 java使用: String c = java.net.URLEncoder.encode(".","utf-8"); System.out.println(c); 源文档 <http://blog.csdn.net/qq1142003960/article/
千往
2018/01/24
2.1K0
【Scala篇】--Scala中的函数
Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明。
LhWorld哥陪你聊算法
2018/09/13
1.5K0
【Scala篇】--Scala中的函数
js中带有参数的函数作为值传入后调用问题
每天不是在写 bug,就是在解 bug 的路上~更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
小闫同学啊
2020/07/14
8.6K0
Redis–SpringCache(二)带有参数的方法缓存
在@Cacheable的key属性中通过#参数名可以获取到方法参数。key中内容Spring EL,既然是表达式字符串要用单引号,没有被单引号包含的内容都表示变量。
全栈程序员站长
2021/04/07
1.4K0
Scala 【 3 循环、函数和参数 】
块表达式,指的是 {} 中的值,其中可以包含多条语句, 最后一个语句的值就是快表达式的值。
Lokinli
2023/03/09
5830
Scala中的偏函数
艺术地说,Scala中的Partial Function就是一个“残缺”的函数,就像一个严重偏科的学生,只对某些科目感兴趣,而对没有兴趣的内容弃若蔽履。Partial Function做不到以“偏”概全,因而需要将多个偏函数组合,最终才能达到全面覆盖的目的。所以这个Partial Function确实是一个“部分”的函数。 对比Function和Partial Function,更学术味的解释如下: 对给定的输入参数类型,函数可接受该类型的任何值。换句话说,一个(Int) => String 的函数可以接收
张逸
2018/03/07
2.6K0
Scala的方法和函数讲解
在Scala中,它和Java一样也是拥有方法和函数。Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说,在类中定义的函数即是方法。
用户8870853
2021/08/30
5060
Scala的方法和函数讲解
在Scala中,它和Java一样也是拥有方法和函数。Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说,在类中定义的函数即是方法。
用户8670130
2021/08/31
8920
Scala 方法与函数(八)
Scala 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
王知无-import_bigdata
2019/03/15
5170
Scala基础 - 函数和方法的区别
1. 函数和方法 在Scala中函数是一等公民,你可以像操作数字一样将函数赋值给一个变量。使用val语句可以定义函数,def语句定义方法: class Test{ def m(x: Int) = x + 3 val f = (x: Int) => x + 3 } 在Scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。有两种方法可以将方法转换成函数: val f1 = m _ 在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也可以显示地告诉编译
joymufeng
2018/05/17
1.3K0
Scala教程之:scala的参数
在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数。
程序那些事
2020/07/07
6190
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/08/03
8470
如何在 Linux 中创建带有特殊字符的文件?
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/07/14
7720
如何在 Linux 中创建带有特殊字符的文件?
Spring @PostMapping 能在 URL 中带有参数吗
Spring 的 @PostMapping 在使用 POST 提交的时候,能不能在 URL 中带参数?
HoneyMoose
2022/09/11
5830
Spring @PostMapping 能在 URL 中带有参数吗
Scala的函数
----------目录--------------------------------------------------------- 1.Scala简介和安装 2.Scala语法介绍 3.Scala的函数 4.Scala中的集合类型 ------------------------------------------------------------------------------------------------------------- Scala的函数 1、函数的声明     scala
云飞扬
2018/05/11
1.4K0
Scala的函数
前文已经提到Scala变量的用法,现在聊聊函数。在Scala里,函数的定义很简单。例如:
哒呵呵
2018/12/18
4320
TypeScript 函数中的 this 参数
从 TypeScript 2.0 开始,在函数和方法中我们可以声明 this 的类型,实际使用起来也很简单,比如:
阿宝哥
2020/03/20
7.8K0
绑定事件中 如可控制函数的执行次数
var flag = true; function onlyOne() { if(flag) { "这里是要执行的代码"; } flag = false//该方法是控制函数仅执行一次 因为flag是全局变量 onlyOne()函数执行一次后flag就变成false了 函数就执行不了了
大当家
2018/06/28
2.3K0

相似问题

用Mockito模拟带函数参数的scala方法

20

如何在scala特征中模拟构造函数参数?

12

如何在scala中模拟参数为新实例的方法

111

Scala (简单)模拟默认方法参数

10

带有递归函数参数的Scala函数

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文