我有一个案例类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"
}
答案 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的调用。 除此之外,测试必须涵盖应用程序的所有可能情况,以确保您的程序在那种情况下能够正常运行。因此,如果可能发生此异常,也应该以与其他任何输出相同的方式对其进行测试