将Scala中的类与Mockito匹配

时间:2015-04-08 16:10:34

标签: scala apache-spark mockito

我试图模拟Spark上下文,以便在调用newAPIHadoopFile时返回模拟的RDD。

我已将其设置如下:

val mockedOuterRdd = mock[RDD[(NullWritable, MyProtobuf)]]

mockedSc.newAPIHadoopFile(anyString, anyObject(),classOf[org.apache.hadoop.io.NullWritable],
  classOf[MyProtobuf],anyObject()) returns mockedOuterRdd

这在编译器中很好,但是当我运行它时我得到了

Invalid use of argument matchers!
5 matchers expected, 3 recorded:
-> at ...
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"));

我是否有办法eq(...)使用classOf[...](我已尝试过但无效)?#/ p>

我已尝试将anyObject用于类,但它会从这些类型中推断出RDD的类型参数,因此它们必须正确。

感谢阅读。

1 个答案:

答案 0 :(得分:3)

eq对我有用,但我猜你可能遗漏了测试框架的一些细节。我使用了scalatest,当我尝试使用eq时,我一直在大吼大叫,要求我返回boolean而不是Class。但是,应该接管一个通用的eq。因此,解决方案是使用完整路径:

mockedSc.newAPIHadoopFile(anyString, anyObject(),
  org.mockito.Matchers.eq(classOf[org.apache.hadoop.io.NullWritable]), 
  org.mockito.Matchers.eq(classOf[org.apache.hadoop.io.NullWritable]), anyObject())