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

mot*_*sch 7 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
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

cmb*_*ter 7

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

trait Foo{
  def bar(s:String):String
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果我想验证给出帕拉姆假值b,foo.bar不叫,我可以设置像这样:

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

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

(foo.bar _).verify("hello").never 
Run Code Online (Sandbox Code Playgroud)