0

我有这段代码

   for (element <- table.find;
     Right(info) = exceptionManager(mapper.getInfoFromDbObject(element)))
yield info

我想对它进行单元测试。我想模拟 table.find 以返回我想要的元素序列。我已经尝试过迭代器接口的模拟hasNext()next()方法,但它似乎不起作用。模拟理解的方法是什么?

4

2 回答 2

3

每个 for comprehension 都转换为map, flatMap,filter方法调用。所以你至少应该嘲笑他们。

您可以在此处找到更多信息(例如):

http://www.lambdascale.com/2010/12/the-adventures-of-a-java-developer-in-monadland/

当然,您会在 Scala 编程一书中找到深入的解释。

编辑

但正如戴夫格里菲斯所说,你可以Iterator自己初始化新的。这是一个使用MockitoScalaTest的示例:

val table = mock[TableClass]
when(table find) thenReturn Iterator(new ModelObject(1), new ModelObject(2))

编辑 1

正如丹尼尔所注意到的,filter方法现在在理解中被弃用了。相反,您应该使用withFilter. 有关更多信息,您可以查看此线程:

http://scala-programming-language.1934581.n4.nabble.com/Rethinking-filter-td2009215.html#a2009218

和这个相关的SO问题:

从过滤器移动到 withFilter 的指南?

于 2011-02-26T16:45:23.773 回答
0

理论上,您应该模拟“map”方法,但您最好让 table.find 返回预定义的集合类型之一。

于 2011-02-26T16:52:09.253 回答