scalamock:子类型上的通配符参数匹配

时间:2015-05-11 07:52:07

标签: scala jmock 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

如何将with(any(SubTypesException.class))中的JMock转换为Scalamock?我可以想象使用谓词匹配(where),这是要走的路吗?

  

编辑:考虑到这一点,JMock with(any(SubTypedException))更多的是让编译器满意并表达意图。据我了解,MatcherIsAnything匹配器,因此如果抛出不同类型的异常,则实际上无法通过测试。

     

因此,可能会要求Scalamock在适当的情况下捕获意图未通过测试。解释如何在Scalamock中执行instanceOf之类的操作。

1 个答案:

答案 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])
相关问题