2009-03-27 2 views
11

.net에서는 Java와 달리 메소드가 기본적으로 가상이 아닙니다. 대부분의 모의 객체 프레임 워크를 사용하려면 모의 객체에서 사용하고자하는 메소드를 가상 객체로 '실제'객체에 표시해야합니다. 그렇지 않으면 테스트중인 클래스를 모의 할 수있는 인터페이스가 있어야합니다. 구현 대신에 수락하십시오.개체 조롱 - 모든 메서드를 가상 또는 인터페이스로 선언 하시겠습니까?

모든 메소드를 가상으로 표시하는 것은 좋지 않지만 모든 단일 클래스에 대한 인터페이스를 정의하는 것은 나쁜 형태처럼 보입니다.

가장 좋은 방법은 무엇입니까?

답변

8

내 실제 경험적 규칙은 실제 구현 클래스 또는 단일 응용 프로그램 구현과 유닛 테스트를위한 가짜 구현을 여러 가지로 구현할 것으로 예상되는 경우 인터페이스를 정의하는 것입니다. 단일 구현 만 기대하고 클래스가 위조 할 필요가 없다면 (대부분 그렇지 않음) 필요에 따라 가상 메서드 경로와 리팩터를 인터페이스에 연결합니다.

+0

나는 인터페이스의 계획된 구현으로 테스트 복식을 다루는 아이디어를 좋아합니다. 클래스 디자인의 일부가 아니라면 다른 사람들을 가상으로 만드는 것을 좋아하는지 모르겠지만, 나중에 뭔가를 조롱 할 필요가있는 경우 다시 코드를 변경해야합니다. – dnewcome

0

누가 당신이 모의 객체는 동일한 클래스 계층 구조에서 파생되어야한다고 말합니까?

필요한 인터페이스가 있고 해당 인스턴스의 인스턴스를 만드는 간단한 독립 실행 형 클래스를 만드는 것이 훨씬 쉽습니다.

모의 수업의 계층 구조를 만들고 단위 테스트 목적으로 사용할 수도 있습니다.

+0

응답 해 주셔서 감사합니다. 당신이 얻고있는 것을 보았지만, 시험 대상 클래스가 모의 작업을하기 위해서는 실제 객체가 구현하는 인터페이스와 실제 인터페이스에서 파생되어야합니다. 나는 모의이 'Is A'관계를 만족시켜야한다고 생각한다. – dnewcome

+0

@dnewcome : 네 말이 맞아 보인다. 내가 작성한 것은 오리 타이핑을 사용하는 언어에서 훨씬 더 낫습니다. –

11

둘 중 하나를 선택해야한다면 인터페이스와 관련이 있습니다. 인터페이스는 기본적으로 모의 객체가 준수 할 계약 인 계약을 정의하기위한 것입니다. 메소드를 가상으로 표시하면 예기치 않은 부작용이 발생할 수 있습니다. 그것은 조롱 당하고있는 실제 수업의 디자인에 영향을 미친다. 인터페이스는 메서드 이름을 정의하기 만하며 실제 클래스에는 아무런 영향을 미치지 않습니다.

+2

이것은 정확성의 관점에서 나에게 의미가 있습니다. .net에서 가상 메소드를 정의하는 것은 클래스 디자이너가 이것을 어딘가에서 오버라이드하려고한다는 것을 나타냅니다. 또한 부작용까지 인라인 될 수 없습니다. 내가 생각하는 계약을 고수하는 모의에 관해서는 당신이 맞습니다. – dnewcome

-1

가장 좋은 것은 머리를 사용하는 것입니다. 시나리오를 생각해보십시오. 가상을 사용하는 것이 더 합리적이라면 그렇게하십시오. 그러나 인터페이스가 작업에 더 적합한 경우에는 그렇게하십시오. 사용하는 가상 방법 :

그래서 정말 새로운 기능을

  • 상속을 추가하는이로를 참조하십시오.
  • 구성 : 인터페이스를 사용하십시오.

여기에는 많은주의 사항이 있습니다. 따라서 머리를 사용하고 시나리오에서 가장 쉬운 작업을 수행하십시오.

+1

당신이 말한 것은 분명히 수업을 설계하는 모범 사례입니다. 내가 가진 문제는 내가 정말로 그 중 하나를 요구하지 않는다는 것이다. 내가 조롱하는 클래스는 일반적으로 동작면에서 독립형이며 모의 메서드를 사용하는 것 이외의 가상 메서드가 필요하지 않습니다. – dnewcome

+0

조롱 할 수없는 것을 조롱하려는 경우 몇 가지 옵션이 있습니다. 먼저 TypeMock이 도움이되는지 확인하십시오.그렇지 않다면 Facade를 그 주위에 놓고 인터페이스를 구현해야합니다. 거기에서 당신은 단지 인터페이스를 조롱하고 삶을 살아갈 수 있습니다. Keep은 간단합니다! –

관련 문제