【发布时间】:2015-02-04 20:22:46
【问题描述】:
给定一个模拟:
val myMock = mock[SomeClass]
我正在尝试对其进行设置,以便模拟返回各种类型的默认值。例如。对于返回 String 的东西,它将返回 ""。
我发现RETURNS_SMART_NULLS 看起来适用于字符串等基本返回类型。这是我在 Scala / Specs2 中使用它的方式:
val myMock = mock[SomeClass].settings(smart = true)
现在问题是:因为我使用的是 Scala,所以我的代码/API 不会返回 null,而是返回 Option 值。所以我想要做的是让模拟默认返回 Option 返回类型的非空值:None(首选)或Some[T],其中 T 是容器中的类型(如果它是 String,则Some(""))。
例如,如果SomeClass 具有Option[String] 类型的属性address,我如何配置mockito 以在myMock.address 调用而不是null 时返回None。这些空值会导致下游错误。
注意,对于我来说,它不是一个可行的解决方案来专门模拟这些单独调用中每个的行为(例如:myMock.address returns None)
【问题讨论】:
-
即使使用argument matchers,也无法将它们连接起来?
-
这是一个有效的问题。以我目前的设置,它不是。但这可能是架构缺陷的更大指标:基本上,我是在 Play Framework 中对控制器进行单元测试。然后这些控制器将这些模拟对象传递给视图,而视图又多次使用模拟。因此,通过视图连接所有可能的模拟调用对我来说是不可行的。对此设置的一般评论也将不胜感激。理想情况下,我想以某种方式将视图与测试隔离,但我还没有弄清楚如何做到这一点。
-
我不知道如何将它与 Mockito 返回类型相关联,但如果你将所有传入值包装在另一个
Option中,然后.flatten它们,你将始终得到None或Some。 IE。Option(Option(null)).flatten == None. -
如果有某种方法可以根据 返回类型 而不是调用本身来连接它,那就太好了:例如“对于每个返回选项的调用,无论调用是什么,都返回一个无”;例如根本没有提到调用的内容。
-
我明白你在说什么,但这需要在我的实际代码中添加大量样板文件(例如我的观点)。这会使阅读变得更加困难,坦率地说有点奇怪(至少对于那些只是在断章取义地阅读我的代码的人来说)。
标签: scala playframework mockito specs2