我们是否需要测试因异常而失败的 public 方法的失败场景?

Do we need to test a failure scenario of a public method which fails with an Exception?

我有案例classEmployee 定义为 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 //
}

现在我使用 scala mock 测试 getEmployees。我不处理来自 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"
}

首先,如果你因为想使用函数式编程而使用 scala,那么最好以更函数式的方式处理错误情况,例如用 Try monad 包装对 getAllEmployees 的调用。 除此之外,测试必须涵盖应用程序的所有可能场景,以确保您的程序在该情况下能够正常运行。因此,如果可能发生此异常,也应该对其进行测试,方法与任何其他输出相同

我认为我们应该测试它,因为这里的语义似乎是 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 的调用方。