제 생각에는 테스트 클래스가 기술적으로 SRP를 위반하지만 SRP의 정신을 위반하지 않습니다. self-shunting의 대안은 모의 클래스를 테스트 클래스와 분리시키는 것이다.
별도의 mock 클래스를 사용하면 자체 포함되어 있으며 SRP를 만족한다고 생각할 수 있지만 mock 클래스의 속성에 대한 의미 적 결합은 여전히 존재합니다. 그래서, 정말로, 우리는 의미있는 분리를 이루지 못했습니다.
PDF 파일에서 예를 촬영 :
public class ScannerTest extends TestCase implements Display
{
public ScannerTest (String name) {
super (name);
}
public void testScan() {
// pass self as a display
Scanner scanner = new Scanner (this);
// scan calls displayItem on its display
scanner.scan();
assertEquals (new Item (“Cornflakes”), lastItem);
}
// impl. of Display.displayItem()
void displayItem (Item item) {
lastItem = item;
}
private Item lastItem;
}
지금 우리가 만드는 모의 : 실질적으로 (IMHO)
DisplayMock
에
TestClass
의 높은 커플 링에서
public class DisplayMock implements Display
{
// impl. of Display.displayItem()
void displayItem (Item item) {
lastItem = item;
}
public Item getItem() {
return lastItem;
}
private Item lastItem;
}
public class ScannerTest extends TestCase
{
public ScannerTest (String name) {
super (name);
}
public void testScan() {
// pass self as a display
DisplayMock dispMock = new DisplayMock();
Scanner scanner = new Scanner (dispMock);
// scan calls displayItem on its display
scanner.scan();
assertEquals (new Item (“Cornflakes”), dispMock.GetItem());
}
}
보다 더 큰 악 TestClass
에 대한 SRP의 위반. 게다가, 조롱 프레임 워크를 사용하면이 문제는 완전히 사라집니다.
EDIT 로버트 C. 마틴의 훌륭한 서적 Agile Principles, Patterns, and Practices in C#에서 자기 분지 패턴에 대한 간략한 언급이 있습니다.
그래서 (같은 책에서 훌륭한 세부 사항에 대해 이야기한다)을 SRP를 만들어 낸 사람이 자기 션트 패턴을 사용하여 양심의 가책이 없습니다 다음은 책의 밖으로 조각입니다. 그렇다면이 패턴을 사용할 때 당신이 OOP (Orientated Police)로부터 꽤 안전하다고 말할 수 있습니다.
분명히 좋은 지적이지만 잘못된 주장입니다. 테스트가 어쨌든 변경 될 가능성이 있기 때문에이 패턴을 사용하더라도 테스트 클래스가 SRP를 위반하지 않는다는 의미는 아닙니다. 실용적인 견지에서 볼 때, 나는 그 패턴을 사용하고 아마도 SRP를 위반하지 않을 것이라고 말했습니다. –