4

在我的课堂上,我有两个版本的方法。一个取一个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))in转换JMockScalamock?我可以想象使用谓词匹配(where),这是要走的路吗?

编辑:考虑一下,JMockwith(any(SubTypedException))更多的是让编译器满意并表达意图。据我了解,它Matcher是一个IsAnything匹配器,因此如果抛出不同类型的异常,测试实际上不会失败。

因此,在正确的情况下,它可能需要 Scalamock 更多地捕捉意图通过测试。解释如何instanceOf在 Scalamock 中执行类似操作的奖励积分。

4

1 回答 1

1

首先:以下内容无法编译,因为类型归属只是为了帮助(静态)重载决议。该行没有任何特定于 Scalamock 的内容:

(mock.method(_: SubTypedException))

要测试参数的运行时类型,您可以使用ArgThatScalaMock 中引入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])
于 2015-05-11T20:31:12.670 回答