Mockito ignora mis pasos de verificación endulzados de Specs2 cuando hay rasgos involucrados
-
21-12-2019 - |
Pregunta
Normalmente, las verificaciones de Mockito azucarado de Specs2 se verifican y no pasan la prueba cuando corresponde.Sin embargo, en algunos casos se ignoran.
Normalmente, esta verificación de prueba falla como se esperaba, ya que myApp llamó a myService al menos una vez.
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
}
}
}
(Nota Con aplicación es una obra de teatro!cosa marco)
Sin embargo, como he introducido rasgos de Cake Pattern en mis componentes, mis pruebas se ven así.
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
}
}
}
donde MockRegistry se parece a esto
trait MockRegistry extends Mockito with MyServiceComponent {
val myService = mock[MyService]
}
La prueba con patrón My Cake nunca falla en la verificación.Puedo cambiar esto a cualquier cosa y todos serán ignorados.
there was no(myService).doSomethingElse
there was one(myService).doSomethingElse
there was two(myService).doSomethingElse
Sin embargo, al reemplazar el paso simulado azucarado con una llamada directa a los métodos de Java, falla cuando es apropiado.
import org.mockito.Mockito._
verify(myService, times(1)).doSomethingElse
Entonces, parece que los rasgos involucrados en el método de prueba han confundido adecuadamente a Mockito.
Solución
Eso es porque el Mockito
extensión de MockRegistry
No sabe que es necesario lanzar excepciones en caso de falla.Pero el Mockito
en Specification
lo hace porque Specification
tiene el ThrownExpectations
rasgo mezclado.
Entonces puedes eliminar el Mockito
extensión de MockRegistry
o agregar ThrownExpectations
lo:
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])
}
Otros consejos
y como se esperaba se debía a los rasgos.Estaba en la cara debida demasiados rasgos de Mockito ...
Mi especificación tuvo un rasgo de Mockito.El patrón de mi pastel se burló del registro de componentes también tenía un rasgo de Mockito.En el método de prueba, ambos fueron parte del objeto, lo que parece confundir las especaciones2 / Mockito.
Así que eliminando el azúcar Mockito de mi registro de componentes simulacros:
//import org.specs2.mock.Mockito._
import org.mockito.Mockito._
trait MockRegistry extends MyServiceComponent {
val myService = mock(classOf[MyService])
}
y solo tienen el azúcar Mockito en la especificación, entonces mis verificaciones azucaradas comenzaron a funcionar como se espera nuevamente.