如果我实际上没有Specs2测试中的count must_== 1
A之类的明确断言,我会遇到一个错误,表明找不到隐式。
// doesn't compile
class Example extends Specification {
"You need an assertion" >> {
// hello!
}
}
足够公平。
但是,如果我也使用Scalamock的MockContext
,我可以仅依靠期望而不是断言;模拟事物,Scalamock将验证方法称为etc;
class MockExample extends Specification {
"I can use 'expectations' here instead" in new MockContext {
val foo = mock[Foo]
(foo.bar _).expects(*).once
// no explicit assertions
}
}
但是,如果我尝试通过在IsolatedMockFactory
中进行混合来共享上下文设置,那么我会回到编译器故障。有什么想法如何解决?
// doesn't compile
class AnotherMockExample extends Specification with IsolatedMockFactory {
val foo = mock[Foo]
"I can't use 'expectations' here any more" >> {
(foo.bar _).expects(*).once
}
}
Specs2中的一个示例接受任何具有org.specs2.execute.AsResult
Typeclass实例的东西。由于(foo.bar _).expects.once
是类型CallHandler
,因此您可以为CallHandler
创建一个AsResult
实例,该实例仅评估值并返回Success
implicit def CallHandlerAsResult[R : Defaultable]: AsResult[CallHandler[R]] = new AsResult {
def asResult(c: =>CallHandler[R]) = {
c
Success
}
}
由于失败是基于异常的Scalamock中的例外,如果不满足模拟期望,则应导致异常。