코드에서 IoC 컨테이너를 사용하는 것이 좋습니다. 동기는 간단하다. 다음 의존성 삽입 코드를 사용하십시오.
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest(
std::auto_ptr<Dependency> d = std::auto_ptr<Dependency>(new ConcreteDependency)
) : d_(d)
{
}
};
TEST(UnitUnderTest, Example)
{
std::auto_ptr<Dependency> dep(new MockDependency);
UnitUnderTest uut(dep);
//Test here
}
으로:
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest()
{
d_.reset(static_cast<Dependency *>(IocContainer::Get("Dependency")));
}
};
TEST(UnitUnderTest, Example)
{
UnitUnderTest uut;
//Test here
}
//Config for IOC container normally
<Dependency>ConcreteDependency</Dependency>
//Config for IOC container for testing
<Dependency>MockDependency</Dependency>
(위는 물론 가상 C ++ 예제입니다)
나는 이것이 의존성 생성자 매개 변수를 제거하여 클래스의 인터페이스를 단순화한다는 데 동의하지만, 두 가지 이유로 치료법이 질병보다 나쁘다고 생각합니다. 첫째, 이것은 나에게 큰 것이므로 프로그램을 외부 구성 파일에 종속시킵니다. 단일 바이너리 배포가 필요한 경우 이러한 종류의 컨테이너를 사용할 수 없습니다. 두 번째 문제는 이제 API가 약하고 더 나쁘고 문자열 형식이라는 것입니다. 증거 (이 가상의 예에서)는 IoC 컨테이너에 대한 문자열 인수이며 결과에 대한 캐스트입니다.
그래서 .. 이런 종류의 용기를 사용하면 다른 이점이 있습니까? 아니면 용기를 추천하는 것에 동의하지 않습니까?