簡體   English   中英

動態替換嵌套對象的字段值

[英]Replace field values of a nested object dynamically

我正在嘗試為我的scala應用程序編寫集成測試(使用akka-http )。 我遇到了一個問題,無法找到解決方案。

我的案例類如下:

case class Employee(id:Long, name:String, departmentId:Long, createdDate:Timestamp) extends BaseEntity
case class EmployeeContainer(employee:Employee, department:Department)  extends BaseEntity

我有這樣的方法

trait BaseTrait[E<:BaseEntity, C <: BaseEntity]{
    def getById(id:Long): Future[List[C]] = {
       //query from db and return result.
    }

    def save(obj:E) = {
      //set the createDate field to the current timestamp
      //insert into database
    }

}

我可以使用BaseTrait擴展類,並重寫getById()方法。 其余各層由我們的內部框架提供。

class MyDao extends BaseTrait[Employee, EmployeeContainer] {
  override def getById(id:Long) = {
      for {
      val emp <- getFromDb(id)
      val dept <- DeptDao.getFromDb(emp.departmentId)
      val container = EmployeeContainer(emp,dept)
      } yield(container)
   }
}

因此,在其余層中,我將以EmployeeContainer身份獲得響應。 我現在面臨的問題是,修改后的日期會自動使用當前時間戳進行更新。 因此,當我取回結果時,傳遞給save()方法的對象中的時間戳將被當前時間覆蓋。 在編寫測試用例時,需要有一個要比較的對象。 但是該對象的時間戳和我收到的對象的時間戳永遠不會相同。

無論如何,我可以用已知的時間戳值替換所有createDate的出現,以便可以在測試用例中進行比較嗎? 主要問題是我無法預測容器的結構(帶有或不帶有createDate字段的容器可以具有多個案例類(嵌套或平面))。

如果主案例類中包含reflection則可以使用reflection來替換該字段,但無法對嵌套結構進行操作。

您可能需要將一些用於控制反轉 您的主要問題是直接調用數據庫: val emp <- getFromDb(id) ,因此無法控制對接收到的值的測試。 在單元測試中調用DB也是一個壞主意,因為它將單元擴展到整個數據庫層。 您想測試一個小的獨立設備。

一個簡單的解決方案是將您的數據庫調用封裝為一個接口,並傳遞該接口的實例。 例如:

    class MyDao extends BaseTrait[Employee, EmployeeContainer](val dbCall: Long => Employee) {
  override def getById(id:Long) = {
      for {
      val emp <- dbCall(id)
      val dept <- DeptDao.getFromDb(emp.departmentId)
      val container = EmployeeContainer(emp,dept)
      } yield(container)
   }
   }

然后,您可以簡單地將new MyDao(getFromDb)用於常規代碼,並從測試代碼中使用val testDao = new MyDao(id => Employee(id, myFixedName, myFixedDeptID, myFixedTestDate))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM