Вам необходимо сохранить аргумент лямбда-выражения для transform
как 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 требует предоставления одинаковых (или равных) аргументов на вызовы имитируемых функций. Когда вы передаете лямбда-выражение без сохранения, каждый вызов transform(withGreeting)
создает новый объект Function[DataFrame, DataFrame]
transform(withGreeting)
совпадает с:
transform(new Function[DataFrame, DataFrame] {
override def apply(df: DataFrame): DataFrame = withGreeting(df)
})
И они не равны друг другу - это является причиной сообщения об ошибке: Argument(s) are different!
Например, попробуйте выполнить:
println(((df: DataFrame) => withGreeting(df)) == ((df: DataFrame) => withGreeting(df))) //false
Подробнее о равенстве объектов можно прочитать в java (в scala то же самое):