종속성 주입을 사용하면 특정 코드 단위를 개별적으로 테스트 할 수 있습니다.
예를 들어, 클래스 의 인스턴스를 해당 생성자에 사용하는 클래스 Foo
이 있습니다. Foo
의 메소드 중 하나는 Bar
의 등록 정보 값이 Bar
의 다른 처리를 허용하는 값인지 점검 할 수 있습니다.
public class Foo
{
private Bar _bar;
public Foo(Bar bar)
{
_bar = bar;
}
public bool IsPropertyOfBarValid()
{
return _bar.SomeProperty == PropertyEnum.ValidProperty;
}
}
이제 Bar
인스턴스화하고이 속성은 그것의 생성자에서 일부 데이터 소스에서 데이터로 설정되어 있다고 가정 해 봅시다. 메서드를 Foo
으로 테스트하면 어떻게 될까요? (이것은 매우 간단한 예입니다). 글쎄, Foo
은 생성자에 전달 된 Bar
의 인스턴스에 따라 달라지며, 이는 차례대로 속성이 설정되는 데이터 소스의 데이터에 따라 달라집니다. 우리가하고 싶은 것은 Foo
을 의존하고있는 리소스로부터 격리 시켜서 우리가 그것을 독립적으로 테스트 할 수 있도록하는 것입니다.
이것은 의존성 주입이 들어오는 곳입니다. Bar
의 인스턴스가 Foo
으로 전달되어이 가짜 Bar
에 설정된 속성을 제어하고 수행 할 작업을 달성하면 IsPropertyOfBarValid()
의 구현이 우리가 기대하는 바를 수행하는지 테스트합니다. 즉, Bar.SomeProperty == PropertyEnum.ValidProperty
과 false를 반환하면 true를 반환합니다. 다른 값.
가짜 개체에는 모의 (Mock) 및 스텁 (Stub)이라는 두 가지 유형이 있습니다. 스텁은 테스트중인 애플리케이션에 대한 입력을 제공하므로 다른 테스트에서 스텁을 수행 할 수 있습니다. 반면에 모의는 pass \ fail을 결정하기 위해 테스트에 대한 입력을 제공합니다.
Martin Fowler has a great article on the difference between Mocks and Stubs
나는 지금까지 당신의 모든 이유가 마음에 든다. 나는 그것이 DI를 "얻는"대부분 숙련 된 프로그래머라고 생각한다. 내가 이해하는 한 DI는 품질에 관한 것입니다. 우리는 프로그래머로서 가능한 한 최고 수준의 소프트웨어를 생산하기를 원하며이를 테스트하는 것이 도움이됩니다. 나는 지난 몇 년 동안 많은 코드를 작성해 왔으며, 10 년이 지난 지금 50 % 이상이 여전히 실행 중이고 DI가 없다고 말하면 기쁩니다. 어쩌면 내가 DI에 대해 왜 조금 비판적인지 이해하는 데 도움이 될까요? – CodeMonkey
분명히 DI는 상대적으로 새로운 말입니다. 따라서 물론 고품질의 소프트웨어를 작성할 수 있습니다. 그러나 테스트 프레임 워크 및 TDD와 같은 것들이 발전함에 따라 DI는 테스트를 작성하고 미래에 유지할 수있는 코드 (커플 링)를 작성하는 것을 훨씬 쉽게 만듭니다. – digiarnie