내 의견으로는 Dependency Injection의 전체 개념이 과대 평가되었다고 말해야합니다.
DI는 현대의 글로벌 가치에 해당합니다. 당신이 주입하는 것은 전역 싱글 톤과 순수한 코드 객체입니다. 그렇지 않으면 주입 할 수 없습니다. 주어진 라이브러리 (JPA, Spring Data 등)를 사용하려면 대부분의 DI 사용이 귀하에게 강요됩니다. DI는 대부분 스파게티를 육성하고 재배하기위한 완벽한 환경을 제공합니다.
정직하게 말하면, 클래스를 테스트하는 가장 쉬운 방법은 모든 종속성이 재정의 가능한 메소드로 작성되도록하는 것입니다. 그런 다음 실제 클래스에서 파생 된 Test 클래스를 작성하고 해당 메소드를 대체하십시오.
그런 다음 Test 클래스를 인스턴스화하고 모든 메소드를 테스트하십시오. 이것은 당신에게 명확하지 않을 것입니다-당신이 테스트하는 방법은 테스트중인 클래스에 속하는 방법입니다. 그리고 이러한 모든 메소드 테스트는 테스트중인 클래스와 연관된 단위 테스트 클래스 인 단일 클래스 파일에서 발생합니다. 여기에는 오버 헤드가 없습니다. 이것이 단위 테스트의 작동 방식입니다.
코드에서이 개념은 다음과 같습니다.
class ClassUnderTest {
protected final ADependency;
protected final AnotherDependency;
// Call from a factory or use an initializer
public void initializeDependencies() {
aDependency = new ADependency();
anotherDependency = new AnotherDependency();
}
}
class TestClassUnderTest extends ClassUnderTest {
@Override
public void initializeDependencies() {
aDependency = new MockitoObject();
anotherDependency = new MockitoObject();
}
// Unit tests go here...
// Unit tests call base class methods
}
결과는 DI를 사용하는 것과 정확히 동일합니다. 즉, ClassUnderTest가 테스트 용으로 구성되어 있습니다.
유일한 차이점은이 코드가 완전히 간결하고, 완전히 캡슐화되고, 코드를 작성하기 쉽고, 이해하기 쉽고, 더 빠르며, 메모리를 적게 사용하며, 대체 구성이 필요하지 않으며, 프레임 워크가 필요하지 않으며, 4 페이지의 원인이되지 않는다는 것입니다 (WTF!) 스택 추적에는 정확히 ZERO (0) 클래스가 포함되어 있으며 초보자부터 전문가에 이르기까지 OO 지식이 거의없는 사람에게는 완전히 분명합니다 (생각하지만 오해 할 것입니다).
물론 우리는 그것을 사용할 수 없습니다-너무 명백하고 유행이 아닙니다.
마지막 날, DI에 대한 나의 가장 큰 관심사는 내가 본 프로젝트가 비참하게 실패한다는 것입니다. DI는 모든 것이 하나로 묶인 접착제 인 거대한 코드베이스였습니다. DI는 아키텍쳐가 아닙니다. 실제로는 소수의 상황에서만 관련이 있습니다. 대부분의 경우 다른 라이브러리 (JPA, Spring Data 등)를 사용하도록 강요됩니다. 대부분의 경우 잘 설계된 코드 기반에서 DI의 대부분의 사용은 일상적인 개발 활동이 이루어지는 수준 이하에서 발생합니다.