当涉及到特征时,Mockito忽略了我的Specs2含糖验证步骤

时间:2014-02-25 12:02:56

标签: scala testing mockito specs2 cake-pattern

通常情况下,Specs2会检查Mockito验证,并在适当的时候通过测试。但在某些情况下,它们会被忽略。

通常,此测试验证会失败,因为myApp至少会调用myService一次。

import org.specs2.mock.Mockito._

class MySpec extends Specification with Mockito {
  "MyApp" should {
     "blow up" in WithApplication {
         val myService = mock[MyService]
         val myApp = new MyApp(myService)

         myApp.doSomething          

         there was no(myService).doSomethingElse
     }
  }
}

(注意 WithApplication 是Play!Framework的事情)

然而,由于我将蛋糕模式特征加入到我的组件中,我的测试看起来像这样。

class MySpec extends Specification with Mockito {
  "MyApp" should {
     "blow up" in WithApplication with MockRegistry {

         val myApp = new MyApp(myService)

         myApp.doSomething          

         there was no(myService).doSomethingElse
     }
  }
}

MockRegistry看起来像这样

trait MockRegistry extends Mockito with MyServiceComponent {
  val myService = mock[MyService]
}

我的蛋糕图案测试永远不会失败验证。我可以将其更改为任何内容,但它们都会被忽略。

there was no(myService).doSomethingElse
there was one(myService).doSomethingElse
there was two(myService).doSomethingElse

然而,通过直接调用java方法替换含糖的mockito步骤,它在适当的时候会失败。

import org.mockito.Mockito._

verify(myService, times(1)).doSomethingElse

因此,似乎涉及测试方法的特征似乎已经恰当地混淆了Mockito。

2 个答案:

答案 0 :(得分:2)

这是因为Mockito的{​​{1}}扩展名不知道在失败的情况下需要抛出异常。但MockRegistry上的Mockito确实存在,因为Specification具有混合的Specification特征。

因此,您可以从ThrownExpectations移除Mockito扩展名或向其添加MockRegistry

ThrownExpectations

答案 1 :(得分:0)

正如预期的那样,这是由于这些特征。由于太多的Mockito特质,它面对面......

我的规格有一个模拟特征。我的蛋糕模式模拟组件注册表也有一个mockito特征。在测试方法上,它们都是对象的一部分,这似乎混淆了Specs2 / Mockito。

所以从模拟组件注册表中删除Mockito糖:

//import org.specs2.mock.Mockito._
import org.mockito.Mockito._

trait MockRegistry extends MyServiceComponent {
  val myService = mock(classOf[MyService])
}

只有Spec中的Mockito糖,然后我的加糖验证开始按预期再次运作。