난 당신이 이런 일에 무엇을 변환하는 것이 좋습니다 :
public class MyClass()
{
private IHelper _helper;
public MyClass()
{
//Default constructor normal code would use.
this._helper = new Helper();
}
public MyClass(IHelper helper)
{
if(helper == null)
{
throw new NullException(); //I forget the exact name but you get my drift ;)
}
this._helper = helper;
}
public void LoadData()
{
SomeProperty = this._helper.GetSomeData();
}
public object SomeProperty {get;set;}
}
지금 클래스는 의존성 주입으로 알려진 지원합니다. 이렇게하면 도우미 클래스의 구현을 삽입 할 수 있으며 클래스가 인터페이스에만 의존하면됩니다. 이 모의를 할 때 IHelper 인터페이스를 사용하는 모의 객체를 생성자에게 전달하면 클래스가 실제 Helper 클래스 인 것처럼 사용하게됩니다.
헬퍼 클래스를 정적 클래스로 사용하는 경우 프록시/어댑터 패턴을 사용하고 IHelper 인터페이스를 지원하는 다른 클래스로 정적 클래스를 래핑하는 것이 좋습니다. 몹시 떠들어 대다).
이 단계를 더 진행하려면 수정 된 클래스에서 기본 도우미 구현을 완전히 제거하고 IoC (Inversion of Control) 컨테이너를 사용할 수 있습니다. 만약 당신이 처음이라면, 나는이 여분의 모든 번거 로움이 왜 가치가있는 지 (IMHO인지)의 기초에 우선 초점을 둘 것을 권한다.
단위 테스트는이 사이비 코드처럼 보일 것입니다 :
public Amazing_Mocking_Test()
{
//Mock object setup
MockObject mockery = new MockObject();
IHelper myMock = (IHelper)mockery.createMockObject<IHelper>();
mockery.On(myMock).Expect("GetSomeData").WithNoArguments().Return(Anything);
//The actual test
MyClass testClass = new MyClass(myMock);
testClass.LoadData();
//Ensure the mock had all of it's expectations met.
mockery.VerifyExpectations();
}
은 질문이있는 경우 의견을 주시기 바랍니다. (그런데이 코드가 모두 작동하는 경우 단서가 없습니다. 브라우저에 입력 한 코드는 개념을 주로 설명하고 있습니다.)
보세요 : http://stackoverflow.com/questions/90851/is-it-just-me-or-are-interfaces-overused –