当涉及特征时,Mockito 会忽略我的 Specs2 加糖验证步骤



通常,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
     }
  }
}

(注意 与应用程序是一出戏!框架的东西)

但是,由于我已经将蛋糕图案特征限制在我的组件中,因此我的测试看起来像这样。

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
     }
  }
}

其中模拟注册表看起来像这样

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

但是,通过将加糖的 mockito 步骤替换为对 java 方法的直接调用,它在适当的时候确实会失败。

import org.mockito.Mockito._
verify(myService, times(1)).doSomethingElse
因此,似乎

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

这是因为MockRegistryMockito扩展不知道在失败时需要抛出异常。但Specification Mockito确实如此,因为Specification混合了ThrownExpectations特征。

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

trait MockRegistry extends MyServiceComponent {
  val myService = mock(classOf[MyService])
}
// or
import org.specs2.matcher.ThrownExpectations
trait MockRegistry extends MyServiceComponent with ThrownExpectations {
  val myService = mock(classOf[MyService])  
}  

正如预期的那样,这是由于特征。这是由于太多的莫基托特质而面对的......

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

因此,通过从我的模拟组件注册表中删除 Mockito 糖:

//import org.specs2.mock.Mockito._
import org.mockito.Mockito._
trait MockRegistry extends MyServiceComponent {
  val myService = mock(classOf[MyService])
}

并且规范中只有 Mockito 糖,然后我的加糖验证再次开始按预期工作。

相关内容

  • 没有找到相关文章

最新更新