首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito的inOrder()和集合/映射

Mockito的inOrder()和集合/映射
EN

Stack Overflow用户
提问于 2015-07-01 02:29:49
回答 1查看 59关注 0票数 0

我有以下情况:我的类保留了两个对象的标识集。

这些集合逐渐填充了一些实例,在测试用例中,它们填充了模拟。

然后我的类有一个调用,它先处理一个集合的内容,然后再处理另一个集合的内容。这就是我正在测试的呼叫。

处理集合的顺序很重要。在集合中处理单个对象的顺序并不重要,事实上,这取决于如何将身份散列分配给集合中的模拟。

所以在我的情况下,我有一个偏序:所有这些对象都必须在处理任何对象之前被处理。

问题是,我如何在Mockito中表达它?inOrder()失败了,因为我必须指定对象的确切顺序,而这不是恒定的。

EN

回答 1

Stack Overflow用户

发布于 2021-10-15 14:26:05

为了讨论在使用Mockito.inOrder时如何处理集合和映射,我们必须区分4种情况,具体取决于

  • 集合或映射是在方法内输入还是创建(input表示通过方法参数、类变量访问集合或映射,或通过方法调用返回,可以对集合或映射进行存根( stubbed)
  • whether )集合或映射是在方法内访问或迭代的(或来自同一类或被调用的超类的另一个方法,因此不能被存根)

这导致了4种组合或4种可能的情况。

  1. 集合或映射是被测试方法的一个输入参数,该方法将其传递给另一个方法或返回它,但不接触它。在这种情况下,只需模拟集合或映射即可。没有问题。

  1. 集合或映射是被测试方法的输入参数,该方法访问(或迭代)它。在这种情况下,您可以创建一个包含一个或多个mock的集合或集合。在这种情况下,您永远不应该模拟集合或映射本身,因为在使用for循环或流(这取决于JRE的实现!)迭代它时,您无法知道调用了哪些方法,并且需要将其存根。因为您必须在调用该方法之前自己创建它,所以您可以决定将使用什么实现。如果它包含2个或更多模拟对象,或者被测试的方法向其添加对象,则创建一个有序的集合或映射。如果该方法不应该修改它,而只是读取它,那么就创建一个不可修改的集合或映射。我喜欢在测试中使用Collections.singleton、Collections.singletonList和Arrays.asList。

  1. 被测试的方法创建并填充集合,但不访问或迭代它。如果该方法将对象添加到集或映射中,这些对象将作为参数传递,然后将集或映射传递给另一个映射或将其返回,则不会出现问题。在这种情况下,没有调用来验证这取决于迭代顺序。您只需在之后断言它的内容(当返回时,或者如果未返回但传递给另一个方法,则使用捕获器)。

  1. 被测试的方法创建并填充集合,然后访问或迭代它。当该方法创建集合或映射并将模拟添加到其中,然后对其进行迭代并对这些模拟进行操作时,如果您使用的是inOrder,并且集合或映射没有排序,那么就确实存在问题。在这种情况下,您应该尝试将该方法拆分为两个方法:一个方法创建并填充集合或映射(在情况3中结束,它可以是工厂类中的工厂方法),另一个方法访问或迭代它(在情况2中结束)。只需创建一个工厂方法并从现有方法中调用它就足以解决问题。

当包含被测试方法的类具有一个set或map作为类变量时,如果该方法访问或修改它,则可以将其视为该方法的输入,如果该方法设置了它,则可以将其视为输出。但是如果它是没有setter或getter的私有或受保护类变量,则可能需要使用反射在调用方法之前使用mock或包含一个或多个mock的set或map来设置它,或者在调用方法之后获取并验证它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31145765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档