Нужно ли тестировать сценарий сбоя публичного метода, который завершается с исключением? - PullRequest
3 голосов
/ 09 июля 2019

У меня есть класс дела Employee, определенный как case class Employee(.........fields.....) У меня есть метод скажет

def getEmployees(organization: String): Future[Seq[Employee]] = {
   val result = employeeClient.getAllEmployees(organization)

   // some logic on this list of Employees received from the 
   client and manipulate it to get  finalListOfEmployees and return it 
   to caller of `getEmployees`//

  finalListOfEmployees

//end //
}

Теперь я проверяю getEmployees, используя макет scala.Я не обрабатываю исключение из getEmployees или не recovering из него.Это означает, что исключение, появляющееся на getAllEmployees метода клиента, будет возвращаться к вызывающей стороне getEmployees.

Теперь вопрос заключается в том, нужно ли нам проверять этот аспект?

Я имел в виду, действительно лиследующий тест добавить любое значение ??

"Fail with future" in {  (mockEmployeeClient.getAllEmployees_).expects("SomeOrganization").returning(Future.failed(new Exception("failed"))
          getEmployees("SomeOrganization).failed.futureValue.getMessage shouldBe "failed"
}

Ответы [ 2 ]

5 голосов
/ 09 июля 2019

Я думаю, что мы должны проверить это, потому что семантика здесь, кажется, вызывает getEmployees, ожидают, что сбои будут представлены сбоем Future. Теперь рассмотрим, что произойдет, если кто-то проведет рефакторинг getEmployees так, чтобы сбои в employeeClient.getAllEmployees(organization) были восстановлены путем возврата пустого списка Future(Nil) вместо этого, например,

def getEmployees(organization: String): Future[Seq[Employee]] = {
 val result = employeeClient.getAllEmployees(organization)
 result.recover { case e => List.empty[Employee] }
 ...
}

Все бы хорошо скомпилировалось, как раньше, но вдруг семантика совсем другая. Модульный тест может поймать это изменение в семантике и предложить нам либо удалить рефакторинг, либо обновить вызывающих абонентов getEmployees соответствующим образом.

1 голос
/ 09 июля 2019

Прежде всего, если вы используете scala, потому что хотите использовать функциональное программирование, лучше обрабатывать случаи ошибок более функциональным способом, например, заключая вызов getAllEmployees в монаду Try. Кроме того, тесты должны охватывать все возможные сценарии приложения, чтобы гарантировать, что ваша программа будет вести себя должным образом в этой ситуации. Таким образом, если это исключение может произойти, оно должно быть проверено так же, как и любой другой вывод

...