2012-01-20 6 views
3

저는 현재 Java로 작성된 레거시 시스템의 테스트 가능성을 향상 시키려고합니다. 가장 최근의 문제는 조롱 될 수없는 "내부"종속성의 존재입니다. 이것에 대한 해결책은 매우 간단합니다 : 의존성 주입을 도입하십시오.생성자 삽입과 기본 생성자를 함께 사용하는 것이 좋지 않습니까?

불행하게도 코드 기반은 꽤 커서, 전체 응용 프로그램에서 "부트 스트랩"까지 종속성 주입을 도입하는 데 엄청난 노력이 필요합니다. 테스트하고자하는 각 클래스에 대해, 변경된 구성 요소에 의존하는 또 다른 100 개의 클래스를 변경해야합니다 (여기에 조금 과장되어 있지만, 분명히 많을 것입니다).

내 질문에 : 그것은 괜찮을까요, 두 개의 생성자, 기본값과 인스턴스 필드를 초기화하는 기본 생성자를 사용하려면 종속성의 주입을 허용하려면 다른 하나? 이 접근법을 사용하면 어떤 단점이 있습니까? 그것은 미래의 사용을 위해 의존성 주입을 허용 할 것이지만 여전히 (테스트중인 클래스에도 불구하고) 기존 코드를 변경할 필요가 없다.

현재 코드 ("내부"종속) : 기본/디 생성자와

public class ClassUnderTest { 

    private ICollaborator collab = new Collaborator(); 

    public void methodToTest() { 
    //do something 
    collab.doComplexWork(); 
    //do something 
    } 

} 

:

public class ClassUnderTest { 

    private ICollaborator collab; 

    public ClassUnderTest() { 
    collab = new Collaborator(); 
    } 

    public ClassUnderTest(ICollaborator collab) { 
    this.collab = collab; 
    } 

    public void methodToTest() { 
    //do something 
    collab.doComplexWork(); 
    //do something 
    } 

} 
+0

저에게는 좋은 전략 인 것 같습니다. 각 메소드 호출시 새 인스턴스를 다시 인스턴스화하는 대신 인스턴스 필드를 사용할 수 있는지 확인하십시오. 두 스 니펫은 동일하지 않습니다. 각 인스턴스 호출시 새 인스턴스를 만들어야하는 경우 공동 작업자를 주입하는 대신 공동 작업자 팩토리를 삽입하십시오. –

+0

아, 물론 이죠. 나는 그 예를 만들 때 그것에 대해 생각하지 않았습니다. 예제를 수정하겠습니다. – user1159435

+3

이것은 Bastard Injection이라 불리며 문제가 될 수 있습니다. http://stackoverflow.com/questions/6733667/is-there-an-alternative-to-bastard-injection-aka-poor-mans-injection-via-defa –

답변

0

, 나는 특히 서비스 스타일 클래스로, 때때로이 절대적으로 잘 할있다이 레거시 코드 또는 프레임 워크 제약 때문에 기본 생성자가 필요합니다.

두 개의 생성자를 사용하면 테스트에서 모의 ​​테스트를 허용하면서 명확하게 기본 공동 작업자 객체를 분리 할 수 ​​있습니다. 두 번째 생성자를 패키지로 보호하고 단위 테스트를 동일한 패키지에 유지함으로써 의도를 강화할 수 있습니다.

본격적인 의존성 주입만큼 좋지는 않지만 항상 선택 사항은 아닙니다.

+0

답변 해 주셔서 감사합니다. 나는 또한 디 생성자의 가시성을 줄이는 것에 대해서 생각했다. 이 경우 가장 좋은 방법이 무엇인지 모르겠습니다.public 생성자를 사용하면 다른 의존성 구현을 사용해야하는 미래의 사례에서 쉽게 재사용 할 수 있습니다 (이는 전체 의존성 주입 개념의 기본 개념입니다). 공개하는 데 불이익이 있습니까? – user1159435

0

나는 이것이 완벽하다고 생각합니다. 내가 parametrized 하나의 관점에서 기본 생성자를 작성하지만, 아마 스타일과 환경 설정의 질문입니다.

하지 않는 사람이 작성한 코드에서 호출하는 경우이 근본적으로 이상한 오류 시나리오로 이어질 것입니다 할려고 ClassUnderTest에 대한 계약 (과 가정)을 변경하기 때문에하는 setCollaborator() α- 함수를 추가에 대해 좀 더 신중 것이 무엇 역사를 알고 제대로 문서를 읽지 못했습니다 (아니면 문서가 전혀 없을 수도 있습니다 ...)

관련 문제