첫째 날 (의존 관계 역전 원칙을 깰 것이다) 의존성 삽입 (Dependency Injection)없이 구현을 소개하자 : 이제의존성 주입 및 특정 종속 구현
public class MyValidator
{
private readonly IChecksumGenerator _checksumGenerator;
public MyValidator(IChecksumGenerator checksumGenerator)
{
_checksumGenerator = checksumGenerator;
}
...
}
:
public class MyValidator
{
private readonly IChecksumGenerator _checksumGenerator;
public MyValidator()
{
_checksumGenerator = new MyChecksumGenerator();
}
...
}
이 코드 검증하자가 IChecksumGenerator 주입하려면 필요한 경우 MyValidator 및 스텁 checksumGenerator를 쉽게 테스트 할 수 있습니다. 그러나 MyValidator 구현은 특정 IChecksumGenerator 구현에 알고리즘 적으로 결합되어 있습니다 (다른 구현에서는 작동하지 않습니다). 그래서 몇 가지 문제가 나타납니다
- 우리는 우리가 MyValidator (MyChecksumGenerator에 커플 링)의 개인 구현 세부로 캡슐화 휴식
- 잘못된 IChecksumGenerator가 (때문에 IOC의 컨테이너 구성 오류의 예를 들어) 주입 될 가능성을 소개 간다
public class MyValidator { private readonly IChecksumGenerator _checksumGenerator; public MyValidator() { _checksumGenerator = new MyChecksumGenerator; } internal MyValidator(IChecksumValidator checksumValidator) { _checksumValidator = checksumValidator; } ... }
그는 : 클래스의 외부
내가에 와서 가장 좋은 해결책은 다음과 같다 내가 테스트 목적으로 (그래서 내가 IChecksumValidator를 테스트에서 스터핑 할 수있는) 특별한 생성자를 소개하지만, 공용 생성자는 결합 된 구현을 생성한다 (그래서 캡슐화는 깨지지 않는다). 테스트 목적으로 약간의 코드를 작성하는 것은 약간 추한 일이지만,이 경우에는 의미가있는 것처럼 보입니다.
이 문제를 어떻게 해결하겠습니까?
MyValidator가 IChecksumGenerator의 특정 구현에서만 작동하는 경우 어떻게 Test Double로 바꾸시겠습니까? 어쨌든 당신은 LSP를 위반할 것입니다 ... –
@Mark : LSP에 관한 좋은 지적입니다. 대답으로 공식화하십시오. 하지만 Test Double에 대한 요점을 찾지 못했습니다. – SiberianGuy
@ldsa : 대답을 추가했습니다. –