2014-12-23 6 views
0

서비스를 조롱하고 서비스 인스턴스를 클래스 인스턴스에 할당하는 것의 차이점은 무엇입니까? 예를 들어Grails 유닛 테스트 모의 서비스 대 서비스 인스턴스 할당

:

class MyService { 

    def CallServiceMethod(){ 
    my business logic 
    } 
} 

class MyController { 
    def myService 

    def callServiceMethod(){ 
    myService.callServiceMethod() 
    } 
} 


@TestFor(MyController) 
class MyControllerTests { 

    @Before 
    void setup() { 
     controller?.myService = new MyService() 
        vs 
     controller?.myService = mockFor(MyService) 
    } 

    void testCallServiceMethod(){ 
     controller.callServiceMethod() 
    } 
} 

중 하나가 제발 도와 드릴까요?

답변

1

Spring을 사용할 때 Spring Bean으로 등록 된 클래스의 새 인스턴스를 생성하면 일반적으로 많은 동작을 잃게됩니다. 빈은 종종 여러 개의 다른 bean 의존성을 가지며 그 필드는 평범한 새 인스턴스에서 null이 될 것이고, 다양한 주석은 메소드가 존재하기 전이나 후에 추가 체크와 행동을 추가하는 하나 이상의 프록시에서 빈 인스턴스를 래핑한다. 새로운 인스턴스에서 발생하지 않습니다. 이러한 프록시에는 @Transactional과 함께 얻는 트랜잭션 래퍼, @Cacheable의 캐시 검사 및 @Secured 및 기타 Spring Security 주석의 보안 검사가 포함됩니다.

또한 Grails는 대부분의 아티팩트 (특히 도메인 클래스와 컨트롤러)에 많은 코드를 추가합니다. 그 대부분은 바이트 코드에 추가되지만, 일부는 런타임에 메타 클래스에 추가됩니다. 바이트 코드는 새로운 인스턴스를 위해 존재하지만 런타임에 구성의 마지막 비트가 필요할 수 있습니다. 예를 들어 도메인 클래스에 100 개가 넘는 GORM 메소드가 추가되었지만 그 자체로는 작동하지 않으므로 현재 GORM 구현 (Hibernate, MongoDB 등)에 "연결"해야합니다. "이 클래스는 Grails 응용 프로그램 외부에서 사용되었습니다."- 어떤 이유로 든 클래스에 GORM impl이 붙어 있지 않아 작동 할 수 없습니다.

mockFor 및 @TestFor 및 @Mock과 같은 특수 효과는이 모든 동작을 추가하지 않지만이 동작의 큰 하위 집합을 추가하고 많은 방법의 비웃음을 사실적으로 구현합니다. 목표는 실제 애플 리케이션에서와 같이 본질적으로 작동하는 런 - 앱과 비슷한 동작을 테스트중인 클래스의 공동 작업자에게 제공하는 것이므로 테스트 데이터베이스 구성에 대해 생각할 필요없이 테스트중인 클래스에 집중할 수 있습니다. 또는 가짜 웹 요청 및 응답 등.

관련 문제