저는 현재 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
}
}
저에게는 좋은 전략 인 것 같습니다. 각 메소드 호출시 새 인스턴스를 다시 인스턴스화하는 대신 인스턴스 필드를 사용할 수 있는지 확인하십시오. 두 스 니펫은 동일하지 않습니다. 각 인스턴스 호출시 새 인스턴스를 만들어야하는 경우 공동 작업자를 주입하는 대신 공동 작업자 팩토리를 삽입하십시오. –
아, 물론 이죠. 나는 그 예를 만들 때 그것에 대해 생각하지 않았습니다. 예제를 수정하겠습니다. – user1159435
이것은 Bastard Injection이라 불리며 문제가 될 수 있습니다. http://stackoverflow.com/questions/6733667/is-there-an-alternative-to-bastard-injection-aka-poor-mans-injection-via-defa –