我有一个案例课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"
}

最佳答案

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

08-08 00:52