2013-03-24 7 views
3

전체 방법을 조롱하는 것이 가능합니까? 아니면 그 방법 안에있는 모든 단일 서비스 호출을 조롱해야합니까? 여기 전체 방법을 조롱하는 방법?

는 (바보) 예입니다

class Foo { 
    void update() { 
     service1.do(); 
     service2.do(); 
     //... 
    } 
} 

class Bar extends Foo { 

    void save() { 
     super.update(); 
     // doSometing that I want to test. 
    } 
} 

내가 Bar.save()를 테스트 할, 나는 모든 서비스 자체를 조롱하지 않고 super.update() 안에 모든 것을 조롱하고 싶다. 그게 가능하니?

+1

Bar가 Foo를 확장해야하지만 코드에 표시되지 않는 것 같습니다. 이것이 맞습니까? – Romski

+0

스텁 및 드라이버? –

+0

조롱에 사용하는 라이브러리는 무엇입니까? – evgenyl

답변

2

바 클래스는 Foo입니다. Bar는 Foo에서 update 메소드를 상속 받았다. 따라서 테스트중인 클래스에서 메서드를 조롱하면 안됩니다. 다음 중 하나를 선택하는 것이 훨씬 더 좋습니다.

  • 컴포지션을 사용하면 자연스럽게 모방하는 것이 좋습니다.
  • FooTest로부터 상속. 너 Foo 테스트를 했지, 그렇지? 모든 서비스를 조롱하는 @ Before setup이 있습니다. 그것을 다시 사용하십시오.
1

귀하의 경우 Bar가 Foo를 확장 한 것으로 보입니다. 그 때문에의

는이 프레임 워크를 조롱하는 것이 더 어렵다, 그러나 대신 테스트에 업데이 트를()를 오버라이드 수 :

Bar testBar = new Bar() { 
@Override 
    void update() { 
    // do nothing 
    } 
} 

assertSomething(bar.save()); 

하지만 ... @smas 잘, 그것은이 작업을 수행 할 필요

class Bar { 

    private Foo foo; 

    public Bar(Foo foo) { 
    this.foo = foo; 
    } 

    void save() { 
    foo.update(); 
    } 

} 

그리고 테스트 :

Bar bar = new Bar(mock(Foo)); 

assertSomething(bar.update()); 
방법은 당신이이-A가-A에 관계하고 바람이 될 것입니다 조롱 중단해야 표시, 코드 냄새
관련 문제