을 테스트하기위한 최대 절전 프록시를 시뮬레이션 다음과 유사한 도메인 클래스 계층 구조와 Grails를 사용하는 경우 :Grails는 :
abstract class Vehicle { ... }
class Car extends Vehicle { ... }
class Motorcycle extends Vehicle { ... }
을 다음과 같은 서비스 :
가class VehicleService {
def startRepairing(Car car) { ... }
def startRepairing(Motorcycle motorcycle) { ... }
}
우리는 매우 자주 우리가 직면 생산시 다음과 같은 오류가 발생합니다.
차량 인증 서비스의 차량 번호가인 경우인수 유형 : (Car _ $$ _ javassist_156) 값 : [Id : 42343, 클래스 : 자동차]. 가능한 해결책 : startRepairing (자동차)
우리는 우리가 프록시가 추상 클래스 Vehicle
아니라 구체적인 클래스 (Car
을 구현하도록하는 모음과 같은 static hasMany = [vehicles: Vehicle]
,에서 Vehicle
인스턴스를 검색하기 때문에 이런 생각 Motorcycle
, 등).
하나의 솔루션은 약입니다 ... 친절한 더 IDE 가능합니다
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 */
}
}
그러나 문제는, 우리가 어떻게이 문제를 테스트 할 수있다 : 유형이 다른 방법과 일치하지 않을 때 악명 높은 GrailsHibernateUtil.unwrapIfProxy를 사용 하는가? 개발시 코드를 실행할 때 javassist 문제를 거의 발견하지 못하고 심지어 프로덕션 환경에서도 "임의로"(또는 더 정확하게는 우리의 지식을 벗어나는 조건으로 인해) 발생하는 것으로 보입니다.
인스턴스를 강제로 javassist 프록시로 설정할 수 있습니까? 이러한 종류의 문제에 대한 일반적인 전략은 무엇이 있습니까?
당신은 groovy의 동적면을 사용하고 코드에서 Car 대신 Object를 선언 할 수 있습니다. 런타임에는 메소드가 프록시 인스턴스에서 발견되며 모든 메소드가 정상적으로 작동합니다. – MatRt
테스트 제한으로 인해 내 메서드의 서명을 변경해도 좋지 않습니다. -/ – Deigote