Проверка Mockito не выполняется, когда метод принимает функцию в качестве аргумента - PullRequest
1 голос
/ 30 мая 2020

У меня есть тест Scala, который использует Mockito для проверки того, что вызываются определенные преобразования DataFrame. Я разбил это на эту простую проблему: c пример

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>);

Почему в этом случае проверка завершится неудачно?

1 Ответ

0 голосов
/ 30 мая 2020

Вам необходимо сохранить аргумент лямбда-выражения для 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 то же самое):

...