scalamock / specs2:如果我没有断言怎么办?仅在 IsolatedMockFactory 中的期望

scalamock / specs2: What if I don't have assertions? Expectations only in IsolatedMockFactory

如果我在 Specs2 测试中实际上没有像 count must_== 1 a 这样的显式断言,我会收到一条错误消息,指示找不到隐式断言。

// doesn't compile
class Example extends Specification {
  "You need an assertion" >> {
    // hello!
  }
}

很公平。

但如果我也使用 scalamock 的 MockContext,我可以只依赖 expectations 而不是断言;模拟一些东西,scalamock 将验证方法被调用等;

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 类型类实例的内容。由于 (foo.bar _).expects.onceCallHandler 类型,您可以为 CallHandler 创建一个 AsResult 实例,它只计算值和 returns Success

 implicit def CallHandlerAsResult[R : Defaultable]: AsResult[CallHandler[R]] = new AsResult {
    def asResult(c: =>CallHandler[R]) = {
      c
      Success
    }
 }

由于在 ScalaMock 中失败是基于异常的,如果不满足某些模拟期望,这应该会导致抛出异常。