Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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 当方法将函数作为参数时,Mockito验证失败_Scala_Mockito_Scalatest - Fatal编程技术网

Scala 当方法将函数作为参数时,Mockito验证失败

Scala 当方法将函数作为参数时,Mockito验证失败,scala,mockito,scalatest,Scala,Mockito,Scalatest,我有一个Scala测试,它使用Mockito来验证是否调用了某些数据帧转换。我把它分解为一个简单的有问题的例子 import org.apache.spark.sql.DataFrame import org.scalatest.funsuite.AnyFunSuite import org.apache.spark.sql.functions._ import org.mockito.{Mockito, MockitoSugar} class SimpleTest extends AnyF

我有一个Scala测试,它使用Mockito来验证是否调用了某些数据帧转换。我把它分解为一个简单的有问题的例子

import org.apache.spark.sql.DataFrame
import org.scalatest.funsuite.AnyFunSuite
import org.apache.spark.sql.functions._
import org.mockito.{Mockito, MockitoSugar}

class SimpleTest extends  AnyFunSuite{

  def withGreeting(df: DataFrame):DataFrame = {
    df.withColumn("greeting", lit("hello"))
  }

  test("sample test") {
    val mockDF = MockitoSugar.mock[DataFrame]
    val mockDF2 = MockitoSugar.mock[DataFrame]
    MockitoSugar.doReturn(mockDF2).when(mockDF).transform(withGreeting)
    mockDF.transform(withGreeting)
    val orderVerifier = Mockito.inOrder(mockDF)
    orderVerifier.verify(mockDF).transform(withGreeting)
  }

}
我试图断言转换是在我的mockDF上调用的,但是它失败了

Argument(s) are different! Wanted:
dataset.transform(<function1>);
-> at org.apache.spark.sql.Dataset.transform(Dataset.scala:2182)
Actual invocations have different arguments:
dataset.transform(<function1>);
参数不同!通缉:
dataset.transform();
->位于org.apache.spark.sql.Dataset.transform(Dataset.scala:2182)
实际调用有不同的参数:
dataset.transform();

在这种情况下,验证为什么会失败?

您需要将
transform
的lambda表达式参数保存为
val
以进行正确的测试,并将其传递给所有
transform
调用:

def withGreeting(df: DataFrame):DataFrame = {
  df.withColumn("greeting", lit("hello"))
}

test("sample test") {
  val mockDF = MockitoSugar.mock[DataFrame]
  val mockDF2 = MockitoSugar.mock[DataFrame]
  val withGreetingExpression = df => withGreeting(df)
  MockitoSugar.doReturn(mockDF2).when(mockDF).transform(withGreetingExpression)
  mockDF.transform(withGreetingExpression)
  val orderVerifier = Mockito.inOrder(mockDF)
  orderVerifier.verify(mockDF).transform(withGreetingExpression)
}
Mockito要求为模拟函数调用提供相同(或相等)的参数。传递lambda表达式而不保存每个调用时
transform(withGreeting)
创建新对象
函数[DataFrame,DataFrame]

transform(带问候语)

同:

transform(new Function[DataFrame, DataFrame] {
  override def apply(df: DataFrame): DataFrame = withGreeting(df)
})
并且它们彼此不相等-这是错误消息的原因:
参数不同

例如,尝试执行:

println(((df: DataFrame) => withGreeting(df)) == ((df: DataFrame) => withGreeting(df))) //false
您可以阅读有关java中对象平等的更多信息(在scala中是相同的):


如果希望Mockito断言某个参数是预期参数,则需要进行相等性检查。这些不会在匿名函数上自动工作。每个带有问候语的
都会为带有问候语的
x=>x
创建一个新的闭包,这些闭包被认为是不同的。也许您不必检查调用哪个函数
transform
,只需让模拟盲目地返回您准备好的结果?