Scala 当方法将函数作为参数时,Mockito验证失败
我有一个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
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
,只需让模拟盲目地返回您准备好的结果?