Tôi đang cố gắng viết kiểm tra tích hợp cho ứng dụng scala
của mình (với akka-http
). Tôi đang gặp một vấn đề, mà tôi không thể tìm ra giải pháp.Thay thế giá trị trường của đối tượng lồng nhau động
lớp Trường hợp của tôi là như sau:
case class Employee(id:Long, name:String, departmentId:Long, createdDate:Timestamp) extends BaseEntity
case class EmployeeContainer(employee:Employee, department:Department) extends BaseEntity
Tôi có một phương pháp như thế này
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
}
}
tôi có thể mở rộng lớp học của tôi với BaseTrait và chỉ cần ghi đè lên các phương pháp GetById(). Phần còn lại của các lớp được cung cấp bởi khung nội bộ của chúng tôi.
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)
}
}
Vì vậy, trong lớp còn lại, tôi sẽ nhận được phản hồi là EmployeeContainer
. Vấn đề bây giờ tôi đang phải đối mặt là, ngày sửa đổi được tự động cập nhật với dấu thời gian hiện tại. Vì vậy, khi tôi lấy lại kết quả, dấu thời gian trong đối tượng mà tôi đã chuyển đến phương thức save() sẽ được ghi đè bằng thời gian hiện tại. Khi tôi viết test case, tôi cần phải có một đối tượng để so sánh. Nhưng dấu thời gian của đối tượng đó và đối tượng tôi nhận được sẽ không bao giờ giống nhau.
Có cách nào, trong đó tôi có thể thay thế tất cả sự xuất hiện của createDate với giá trị đã biết của dấu thời gian để tôi có thể so sánh nó trong testcase của tôi? Vấn đề chính là tôi không thể dự đoán cấu trúc của container (nó có thể có nhiều trường hợp lớp (lồng nhau hoặc bằng phẳng) có hoặc không có các trường createDate).
Tôi có thể thay thế trường bằng cách sử dụng reflection
nếu nó nằm trong lớp vỏ chính, nhưng không thể làm cho các cấu trúc lồng nhau.