Quando si utilizza graal con una gerarchia di classi di dominio simile al seguente:Grails: simulare un proxy Hibernate per testare
abstract class Vehicle { ... }
class Car extends Vehicle { ... }
class Motorcycle extends Vehicle { ... }
e un servizio come la seguente:
class VehicleService {
def startRepairing(Car car) { ... }
def startRepairing(Motorcycle motorcycle) { ... }
}
Siamo molto frequentemente ci faccia errori come segue nella produzione:
Nessuna firma del metodo: VehicleService.startRepairing() è applicabile per tipi di argomenti: (Car _ $$ _ javassist_156) valori: [Id: 42343, Classe: Car]. Possibili soluzioni: startRepairing (Car)
Crediamo che questo accade perché recuperiamo l'istanza Vehicle
da una collezione, come static hasMany = [vehicles: Vehicle]
, che fa sì che il proxy per implementare la classe astratta Vehicle
ma non la classe concreta (Car
, Motorcycle
, eccetera).
Abbiamo usato per rimuovere il tipo di argomento dal metodo come una soluzione, ma ci sarebbe piuttosto avere - il codice è più pulito, overload del metodo è possibile, più IDE amichevole ...
Una soluzione abbiamo pensato è utilizzare il famigerato GrailsHibernateUtil.unwrapIfProxy quando il tipo non corrisponde a qualsiasi altro metodo:
class VehicleService {
def startRepairing(Vehicle vehicle) {
startRepairing(GrailsHibernateUtil.unwrapIfProxy(vehicle))
}
def startRepairing(Car car) {
/* actual business logic here */
}
def startRepairing(Motorcycle motorcycle) {
/* actual business logic here */
}
}
Ma allora la domanda è: come possiamo provare questa? Quando si esegue il codice in fase di sviluppo, troviamo molto raramente il problema del javassist, e anche in produzione sembra che si verifichi "casualmente" (o più precisamente, a causa di condizioni che sfuggono alla nostra conoscenza :).
E 'possibile forzare un'istanza come proxy javassist? Quale sarebbe una buona strategia per questo tipo di problemi in generale?
Yo ucan usa il lato dinamico di groovy e dichiara Object al posto di Car nel tuo codice. In fase di runtime, il metodo verrà trovato sull'istanza proxy e tutto andrà bene. – MatRt
Cambiare la firma del mio metodo a causa di limiti di test non mi suona bene: -/ – Deigote