Scala 将其包装在命名函数中

Scala 将其包装在命名函数中,scala,mockito,scalatest,mockito-scala,Scala,Mockito,Scalatest,Mockito Scala,假设我有这样的东西(过于简化了): 这很有效。然而,断言本身有点复杂,可以使其更具可读性。 我试过这个: val withFooHavingBarSetTo = (expectedBar: String) => argThat(fooHasBarSetTo(expectedBar, _)) //and then mockFnThatTakesFoo(withFooHavingBarSetTo("blah")) wasCalled once 整洁多了!但不起作用:/

假设我有这样的东西(过于简化了):

这很有效。然而,断言本身有点复杂,可以使其更具可读性。
我试过这个:

val withFooHavingBarSetTo = (expectedBar: String) => argThat(fooHasBarSetTo(expectedBar, _))

//and then
mockFnThatTakesFoo(withFooHavingBarSetTo("blah")) wasCalled once
整洁多了!但不起作用:/

> [info] FooSpec:
[info] - should do stuff *** FAILED ***
[info]   org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers!
[info] 1 matchers expected, 2 recorded:
[info] -> at com.foo.FooSpec.argThat(FooSpec.scala:28)
[info] -> at com.foo.FooSpec.$anonfun$new$5(FooSpec.scala:204)

知道怎么做吗?

我相信Mockito是使用宏实现的,它跟踪放置
arg的位置,以及其他Mockito方法。例如,如果您尝试创建一个变量,如

val blahBar=argThat(fooHasBarSetTo(“blah”,_u2;))
您将得到一个异常“此处检测到错误放置或错误使用的参数匹配器”。因此,不可能从另一个方法返回该匹配器

如果您需要重用具有不同参数值的模拟匹配器,我只看到一种可能的解决方案,如

def mockCalledOnceWithFooHavingBar(expectedBar:String){
mockfntakesfoo(argThat(fooHasBarSetTo(expectedBar,))只调用了一次
}
用FooHavingBar(“废话”)模拟调用
使用FooHavingBar(“bar”)模拟调用

我不确定我是否理解您要测试的内容。似乎fooHasBarSetTo返回一个布尔值,而MockFnthatstakesFoo接受一个foo。它是如何编译的?你能详细说明你想测试什么吗?您可以尝试使用mockito的verify方法
fooHasBarSetTo
是一个函数,用于帮助断言传递给
mockfnthattakesfo
的参数。这就是mokito的
arg的工作原理,它接受一个函数,该函数接受一个被测试函数(
mockfnthattakesfo
)会接受的参数,并返回true以通过断言,返回false以失败断言。就像我说的,这太简单了。实际上,我使用这种方法来测试我的服务所依赖的模拟欺骗服务。因此,
fooHasBarSetTo
等价物将接受调用服务模拟的参数,反序列化主体缓冲区等,并对此进行更详细的断言。你是对的。但是argThat,至少在scala中,需要一个您不重写的ArgumentMatcher。我有点确定我理解您正在测试的场景。您正在测试的方法是什么?
arg它可以接受一个函数,该函数只接受一个参数并返回一个布尔值。在文档中向下查看。
> [info] FooSpec:
[info] - should do stuff *** FAILED ***
[info]   org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers!
[info] 1 matchers expected, 2 recorded:
[info] -> at com.foo.FooSpec.argThat(FooSpec.scala:28)
[info] -> at com.foo.FooSpec.$anonfun$new$5(FooSpec.scala:204)