Проверка на фиктивный объект не относится к тестовому случаю - PullRequest
0 голосов
/ 01 февраля 2019

Проблема:

Допустим, у нас есть два разных сервиса

class ServiceA(serviceB: ServiceB) {

  def methodA(): String = {
    "methodA called"
    serviceB.methodB()
  }

  def methodA2(): String = {
    "methodA2 called"
    serviceB.methodB()
  }
}

Я пишу два метода тестирования и пытаюсь проверить, вызван ли метод B или нет.Когда я запускаю два теста отдельно, тесты проходят.Когда я запускаю все методы тестирования, проверка дает неверный результат для второго теста.В контексте тестового класса mockito-validation записывает все вызовы фиктивного объекта.Я думаю, что mockito-scala должен сбрасывать количество проверок на фиктивных объектах после каждого теста

class ServiceATest extends FlatSpec with IdiomaticMockito {
  val serviceB: ServiceB = mock[ServiceB]
  val serviceA: ServiceA = new ServiceA(serviceB)
  "methodA" should "called" in {
    serviceA.methodA()
    serviceB.methodB wasCalled once // Passes
  }
  "methodA2" should "called" in {
    serviceA.methodA2()
    serviceB.methodB wasCalled once // Fail. was 2 times
  }
}

Кстати, я пробовал с mockito-core, он выдает ту же ошибку.

1 Ответ

0 голосов
/ 02 февраля 2019

Ваши serviceA и serviceB объекты фактически являются тестовыми приборами, но вы делитесь ими неправильно.С таким же кодом, как и у вас, одни и те же объекты используются всеми тестами, и это означает, что тесты взаимодействуют друг с другом через общее грязное состояние.ScalaTest поддерживает множество способов совместного использования приборов .Одним из более чистых способов является шаблон займа , например:

class ServiceATest extends FlatSpec with IdiomaticMockito {

  def withServicesAandBMock(testCode: (ServiceA, ServiceB) => Any) {
    val serviceB: ServiceB = mock[ServiceB]
    val serviceA: ServiceA = new ServiceA(serviceB)
    testCode(serviceA, serviceB)
  }

  "methodA" should "called" in withServicesAandBMock { (serviceA, serviceB) =>
    serviceA.methodA()
    serviceB.methodB wasCalled once // Passes
  }

  "methodA2" should "called" in withServicesAandBMock { (serviceA, serviceB) =>
    serviceA.methodA2()
    serviceB.methodB wasCalled once // now passes as well
  }
}

В качестве альтернативы вы можете использовать ResetMocksAfterEachTest

class ServiceATest extends FlatSpec with IdiomaticMockito with ResetMocksAfterEachTest {

  val serviceB: ServiceB = mock[ServiceB]
  val serviceA: ServiceA = new ServiceA(serviceB)
  "methodA" should "called" in {
    serviceA.methodA()
    serviceB.methodB wasCalled once // Passes
  }
  "methodA2" should "called" in {
    serviceA.methodA2()
    serviceB.methodB wasCalled once // now passes as well
  }
}

, ноИМХО это вид обмана

...