Mockito игнорирует мои Specs2 подслащенные шаги проверки, когда задействованы черты
Обычно проверяются спецификации Specs2 с засахаренным мокито, и в случае необходимости тест не проходит. Однако в некоторых случаях они игнорируются.
Обычно это тестовое подтверждение завершается неудачно, как и ожидалось, так как 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)
Однако, поскольку я включил в свой компонент черты Cake Pattern, мои тесты выглядят так.
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]
}
Мой шаблонный тест Cake никогда не проходит проверку. Я могу изменить это на что угодно, и все они игнорируются.
there was no(myService).doSomethingElse
there was one(myService).doSomethingElse
there was two(myService).doSomethingElse
Однако, заменяя шаг подслащенного мокито прямым вызовом методов java, он завершается неудачно, когда это необходимо.
import org.mockito.Mockito._
verify(myService, times(1)).doSomethingElse
Таким образом, кажется, что использование черт в тестовом методе неправильно запутало Mockito.
2 ответа
Это потому что Mockito
расширение MockRegistry
не знает, что исключения должны быть выброшены в случае неудачи. Но Mockito
на Specification
делает потому что Specification
имеет ThrownExpectations
черта смешанная.
Таким образом, вы можете удалить Mockito
расширение от MockRegistry
или добавить 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])
}
И, как и ожидалось, это было связано с чертами. Это было в лицо из-за слишком многих черт характера Mockito...
У моей спецификации была черта mockito. В моем реестре макетов компонентов торта была также черта mockito. В тестовом методе они оба были частью объекта, что, похоже, сбивает с толку Specs2/Mockito.
Итак, удалив сахар Mockito из моего реестра фиктивных компонентов:
//import org.specs2.mock.Mockito._
import org.mockito.Mockito._
trait MockRegistry extends MyServiceComponent {
val myService = mock(classOf[MyService])
}
И только в моём спеке был сахар Mockito, и мои засахаренные проверки снова заработали, как и ожидалось.