我试图模拟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的类型参数,因此它们必须正确。
感谢阅读。
答案 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())