Scalamock:子类型上的通配符匹配



在我的课程中,我有两个方法的版本。一个服用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))更多地是在使编译器快乐并表达意图。据我了解,MatcherIsAnything匹配器,因此如果抛出其他类型的异常,则实际上不会失败。

因此,在正确的情况下,捕获意图均未使测试未通过测试,可能会要求一些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])

相关内容

  • 没有找到相关文章