【问题标题】:Invalid use of argument matchers 0 matches expected. 3 recorded参数匹配器的无效使用 0 预期匹配。 3 记录
【发布时间】:2018-11-09 23:05:53
【问题描述】:

我正在使用 MockitoSugar 在 scala 中编写单元测试。我正在使用org.mockito.Mockito.whenorg.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 = {

当我在模拟对象上调用方法 getCatalogSource() 时,为什么会显示 0 matchers expected

【问题讨论】:

  • getCatalogSource的定义是什么?
  • 另外“使用 mockito 因为 scalamock 不能使用胶水”评论看起来很可疑。为什么scalamock不起作用。你确定 mockito 可以吗?
  • 我不确定是否可以发布getCatalogSource 的代码,因为它是一个内部包。是的,我已经验证了 scalamock 不起作用,并且我已经看到 mockito 在其他包中成功使用。
  • 不是代码...只是定义。
  • 是的!这就是@JamesWhiteley 的问题。

标签: scala unit-testing mockito aws-glue


【解决方案1】:

问题是getCatalogSource() 具有我没有使用匹配器传递的默认参数。我把测试中的方法调用改成

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

测试通过了。

【讨论】:

    【解决方案2】:

    如果您使用 mockito 的 scala 版本,将为您处理默认参数,它还允许您混合原始参数和参数匹配器

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多