Sto provando a scrivere il test di integrazione per l'applicazione scala
(con akka-http
). Sto incontrando un problema, per il quale non sono in grado di trovare una soluzione.Sostituisce dinamicamente i valori di campo di un oggetto nidificato
Le mie lezioni di caso sono le seguenti:
case class Employee(id:Long, name:String, departmentId:Long, createdDate:Timestamp) extends BaseEntity
case class EmployeeContainer(employee:Employee, department:Department) extends BaseEntity
Ho un metodo come questo
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
}
}
posso prolungare la mia classe con BaseTrait e basta sovrascrivere il metodo getById(). Il resto degli strati è fornito dalla nostra struttura interna.
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)
}
}
Così nello strato resto, sarà sempre la risposta come la EmployeeContainer
. Il problema che ora sto affrontando è che la data modificata viene automaticamente aggiornata con il timestamp corrente. Quindi, quando ritorno al risultato, il timestamp dell'oggetto passato al metodo save() verrà sovrascritto con l'ora corrente. Quando scrivo il caso di test, ho bisogno di avere un oggetto da confrontare. Ma il timestamp di quell'oggetto e quello che ottengo non sarà mai lo stesso.
C'è comunque, in cui posso sostituire tutte le occorrenze di createDate con un valore noto di timestamp in modo da poterlo confrontare nel mio testcase? Il problema principale è che non posso prevedere la struttura del contenitore (può avere più case classes (nidificate o piatte) con o senza campi createDate).
Sono stato in grado di sostituire il campo utilizzando reflection
se è presente nella classe del case principale, ma non è in grado di farlo per le strutture nidificate.