我们是否需要测试一个公共方法的失败场景,该场景会因Exception而失败?

时间:2019-07-09 05:45:55

标签: scala unit-testing scalatest scalamock

我有一个案例类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 //
}

现在,我使用scala模拟测试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"
}

2 个答案:

答案 0 :(得分:5)

我认为我们应该对其进行测试,因为此处的语义似乎是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 :(得分:1)

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