Неправильное использование сопоставителей аргументов. Ожидается 0 совпадений. 3 записи - PullRequest
0 голосов
/ 10 ноября 2018

Я пишу юнит-тесты в Scala, используя MockitoSugar . Я использую org.mockito.Mockito.when и org.mockito.Matchers.anyString. Тестируемый метод показан ниже.

def getDataSourceToDataFrame(database: scala.Predef.String, tableName: scala.Predef.String): DataFrame = {
glueContext.getCatalogSource(
  database = database,
  tableName = tableName,
  transformationContext = database + "." + tableName + ".read")
  .getDynamicFrame()
  .toDF()

}

Вот как выглядит мой юнит-тест:

import com.amazon.rrsetlglue.glue.wrappers.WrappedGlueContext
import com.amazonaws.services.glue.{DynamicFrame, GlueContext, DataSource}
import org.scalatest.{BeforeAndAfter, FunSuite, Matchers}
import org.apache.spark.sql.DataFrame
import org.mockito.Mockito.when
import org.mockito.Matchers.anyString
import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
// Use Mockito because ScalaMock does not work with Glue
@RunWith(classOf[JUnitRunner])
class WrappedGlueContextTest extends FunSuite with 

org.scalatest.mockito.MockitoSugar with BeforeAndAfter  {

  var mockGlueContext : GlueContext = _
  var wrappedGlueContext: WrappedGlueContext = _

  before {
    mockGlueContext = mock[GlueContext]
    wrappedGlueContext = new WrappedGlueContext(mockGlueContext)
  }


 test("Test get dataFrame from glue data catalog source") {

    val mockedDataSource: DataSource= mock[DataSource]
    val mockDynamicFrame: DynamicFrame = mock[DynamicFrame]
    val mockDataFrame: DataFrame = mock[DataFrame]
    assert(wrappedGlueContext.glueContext === mockGlueContext)

    when(mockGlueContext.getCatalogSource(anyString, anyString, anyString)).thenReturn(mockedDataSource)

 }
}

Последний when() вызов вызывает ошибку ниже:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 0 matchers expected, 3 recorded: This exception may occur if matchers are combined with raw values: //incorrect: someMethod(anyObject(), "raw String"); When using matchers, all arguments have to be provided by matchers. For example: //correct: someMethod(anyObject(), eq("String by matcher")); For more info see javadoc for Matchers class.

Определение для getCatalogSource() показано ниже

 def getCatalogSource(database: String, tableName: String, redshiftTmpDir: String = "",
                   transformationContext: String = "", pushDownPredicate: String = "",
                   additionalOptions: JsonOptions = JsonOptions.empty, catalogId: String = null): DataSource = {

Почему это говорит 0 matchers expected, когда я вызываю метод getCatalogSource() на макете?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Если вы используете scala-версию mockito , аргументы по умолчанию будут обрабатываться для вас, это также позволит вам смешивать необработанные параметры и сопоставления аргументов

0 голосов
/ 13 ноября 2018

Проблема заключалась в том, что getCatalogSource() имели параметры по умолчанию, которые я не передавал, используя свои сопоставители. Я изменил вызов метода в тесте на

 when(mockGlueContext.getCatalogSource(anyString, anyString, anyString, anyString, anyString, any(), any())).thenReturn(mockedDataSource)

и тест пройден.

...