Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用按名称传递参数模拟函数_Scala_Unit Testing_Junit_Mocking_Mockito - Fatal编程技术网

Scala 使用按名称传递参数模拟函数

Scala 使用按名称传递参数模拟函数,scala,unit-testing,junit,mocking,mockito,Scala,Unit Testing,Junit,Mocking,Mockito,我的实际用例是涉及到finagleFuturePool的单元测试代码:我想确保实际调用了FuturePool.apply,以便在池的正确实例中执行任务 然而,我遇到的问题似乎更一般,所以我将用一个抽象的例子来说明,与欺骗或未来无关 假设我有两个类: class Foo { def apply(f: => String) = f } class Bar(val foo: Foo) { def doit(f: => String) = f

我的实际用例是涉及到finagle
FuturePool
的单元测试代码:我想确保实际调用了
FuturePool.apply
,以便在池的正确实例中执行任务

然而,我遇到的问题似乎更一般,所以我将用一个抽象的例子来说明,与欺骗或未来无关

假设我有两个类:

    class Foo {
      def apply(f: => String) = f
    }

    class Bar(val foo: Foo) {
      def doit(f: => String) = foo(f)
    }
Bar
有一个
Foo
的实例,它知道如何运行函数,我想测试它是否实际使用它来执行:

    describe("Bar") {
      it("should use the right foo") {
        val foo = mock[Foo]
        when(foo.apply(any)).thenAnswer( new Answer[String] {
          def answer(invocation: InvocationOnMock): String =
            invocation.getArgumentAt(0, classOf[Function0[String]]).apply()
        })
        new Bar(foo).doit("foo") should equal("foo")
      }
    }
这不起作用:
.doit
显然返回null,因为mockito没有意识到它被模拟了。在这种情况下,
any
似乎与
Function0
不匹配(将其替换为
any[Function0[String]]
也没有帮助

我还尝试了另一种方式:

it("should Foo!") {
    val foo = Mockito.spy(new Foo)
    new Bar(foo).doit("foo") should equal("foo")
    verify(foo).apply(any)
  }
这也不起作用,并且在某种程度上证实了我对
any
在这种情况下不起作用的怀疑:

Argument(s) are different! Wanted:
foo$1.apply(
    ($anonfun$apply$mcV$sp$7) <function0>
);
Actual invocation has different arguments:
foo$1.apply(
    ($anonfun$apply$mcV$sp$6) <function0>
);
参数不同!需要:
foo$1.5申请(
($anonfun$apply$mcV$sp$7)
);
实际调用有不同的参数:
foo$1.5申请(
($anonfun$apply$mcV$sp$6)
);
有什么好办法可以解决这个问题吗?

这个签名:

def apply(f: => String)
被称为“名称调用”,它传递一个表达式而不是一个计算表达式。这是Scala特有的,Mockito不太支持

对此,有许多变通方法:


看起来最简单,您可能需要它。

我无法更改正在模拟的库类上的方法定义。。。