如何断言使用ScalaTest和ScalaMock永远不会调用mocked方法?

时间:2014-01-07 12:41:59

标签: unit-testing scala mocking scalatest

我正在使用ScalaTest 2.0和ScalaMock 3.0.1。我怎么断言从未调用过模拟特征的方法?

import org.scalatest._
import org.scalamock._
import org.scalamock.scalatest.MockFactory

class TestSpec extends FlatSpec with MockFactory with Matchers {

  "..." should "do nothing if getting empty array" in {
    val buyStrategy = mock[buystrategy.BuyStrategyTrait]
    buyStrategy expects 'buy never
    // ...
  }
}

2 个答案:

答案 0 :(得分:5)

使用ScalaMock有两种样式;我将向您展示一个解决方案,显示基于Mockito的Record-Then-Verify样式。假设您有一个特征Foo如下:

trait Foo{
  def bar(s:String):String
}

然后是一个使用该特征实例的类:

class FooController(foo:Foo){  
  def doFoo(s:String, b:Boolean) = {
    if (b) foo.bar(s)
  }
}

如果我想验证给出param b的错误值,foo.bar未被调用,我可以这样设置:

val foo = stub[Foo]
val controller = new FooController(foo)
controller.doFoo("hello", false)
(foo.bar _).verify(*).never 

使用*,我说没有为任何可能的字符串输入调用bar。但是,您可以使用您指定的确切输入来获得更具体的信息:

(foo.bar _).verify("hello").never 

答案 1 :(得分:0)

如果您使用期望优先风格,这实际上是您没有明确设置期望的任何方法的默认值。所以你不需要做任何事情。但是,一般而言,您不得在具有不同期望的测试之间重复使用模拟 - 这将不起作用 - 而是必须为每个测试创建一个新模拟。