익명 수업을 테스트하는 방법?
-
16-09-2019 - |
문제
나는 당신 이이 관용구에 익숙해야한다고 믿는다.
//In the "Resource Manager" class
public void process(Command cmd){
//Initialize
ExpensiveResource resource = new ExpensiveResource();
//Use
cmd.execute(resource);
//Release / Close
resource.close();
}
//In the Client class...
manager.process(new Command(){
public void execute(ExpensiveResource res){
//Do things with the resource
}
});
나는이 관용구/패턴을 많이 사용했지만 최근에 나는 그것을 테스트하려고했다, 그리고 그것은 나에게 두통을주고있다 ...
ResourceManager와 클라이언트 클래스를 분리하여 어떻게 테스트합니까? 나는 이것이 꽉 조이는 것을 너무 많이 발견하여 쉽게 할 수 없다는 것을 알았습니다.
아이디어는 감사합니다.
문안 인사
해결책
익명 유형을 테스트 할 수있는 실제 유형을 만들고 싶지 않은 경우 Execute () 함수의 코드를 테스트 할 수있는 다른 기능으로 이동하는 것이 좋습니다. 익명 유형은 겸손한 물체가됩니다 (http://xunitpatterns.com/humble%20object.html).
편집하다 그러나 익명 기능에서 코드를 테스트하는 방법을 계속 찾아야합니다.
C#과 같은 TypeSafe 언어에서는 익명 코드가 가상 멤버 함수를 호출하도록하여 수행 할 수 있습니다. 이 테스트는 가상 함수 호출을 재정의하여 클래스를 전문으로합니다.
JavaScript와 같은 비 형성 언어에서 호출되는 멤버 함수는 이미 가상입니다. 따라서 파생 유형을 만들지 않고 녹음 된 버전으로 호출 된 멤버 함수를 덮어 쓸 수 있습니다.
다른 팁
익명의 수업은 너무 작고 간단해야하므로 구조를 포함하여 구조를 테스트하는 것이 충분해야한다고 생각합니다.
테스트해야 할 필요성이 너무 복잡하고 크고 중요하다면 전체 수업으로 만듭니다.
익명의 내부 클래스를 많이 사용하지 마십시오 (전혀). 테스트하기가 어렵지만 복사 및 붙여 넣기없이 재사용하는 것은 사실상 불가능합니다.
대부분의 경우 전체 클래스를 만들면 더 많은 유연성을 제공하고 OO 디자인을 향상시킵니다 (더 많은 클래스 추가는 거의 항상 디자인을 향상시킵니다).
그건 그렇고, 당신이 언급했듯이, 폐쇄는 또한 동일한 문제가 있습니다-재사용에 대한 접근.