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, и мои засахаренные проверки снова заработали, как и ожидалось.

Другие вопросы по тегам