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