在我的课程中,我有两个方法的版本。一个服用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
如何将JMock
中的with(any(SubTypesException.class))
转换为Scalamock
?我可以想象使用谓词匹配(where
),这是要走的路吗?
编辑:考虑到它,JMOCK
with(any(SubTypedException))
更多地是在使编译器快乐并表达意图。据我了解,Matcher
是IsAnything
匹配器,因此如果抛出其他类型的异常,则实际上不会失败。因此,在正确的情况下,捕获意图和均未使测试未通过测试,可能会要求一些scalamock。在解释如何在Scalamock中进行
instanceOf
之类的奖励点。
首先:以下内容不编译,因为类型的归属仅是为了帮助(静态)过载分辨率。该行没有特定于Scalamock的特定:
(mock.method(_: SubTypedException))
要测试参数的运行时类型,您可以使用Scalamock 3.2.1
中引入的ArgThat
以及辅助功能:
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])