在我的班上,我有一个方法的两个版本。一个需要Exception
,另一个需要String
。
class Foo {
def method(e: Exception) = ???
def method(s: String) = ???
}
在JMock
中,我可以基于其类型模拟对方法的调用。请注意,我使用Exception
的子类型来确定我在测试中期望的内容。
context.checking(new Expectations() {{
oneOf(mock).method(with(any(SubTypedException.class)));
}}
并且在Scalamock
中,我可以使用通配符来匹配
(mock.method(_: Exception)).expects(*).once
当我尝试匹配特定的子类型时,以下代码无法编译(我意识到这在Scala中没有意义)。
// doesn't compile
(mock.method(_: SubTypedException)).expects(*).once
如何将with(any(SubTypesException.class))
中的JMock
转换为Scalamock
?我可以想象使用谓词匹配(where
),这是要走的路吗?
编辑:考虑到这一点,JMock
with(any(SubTypedException))
更多的是让编译器满意并表达意图。据我了解,Matcher
是IsAnything
匹配器,因此如果抛出不同类型的异常,则实际上无法通过测试。因此,可能会要求Scalamock在适当的情况下捕获意图和未通过测试。解释如何在Scalamock中执行
instanceOf
之类的操作。
答案 0 :(得分:1)
首先:以下内容无法编译,因为类型归属仅用于帮助(静态)重载分辨率。该行没有Scalamock特有的内容:
(mock.method(_: SubTypedException))
要测试参数的运行时类型,可以使用ScalaMock ArgThat
中引入的3.2.1
和辅助函数:
import scala.reflect.ClassTag
def typedArg[T, U : ClassTag]: ArgThat[T] = new ArgThat[T]({
case x: U => true
case _ => false
})
(mock.method(_: Exception)).expects(typedArg[Exception, SubTypedException])