2009-06-30 6 views
2

클래스에서 동일한 문자열을 쓰는 다른 메서드를 호출하는 메서드가 있습니다. 같은 뭔가 : 단위 테스트 목적으로단위 테스트를 위해 Java에서 개별 메소드를 스텁하는 방법은 무엇입니까?

void foo() { 
    a += "xyx"; 
    bar(); 
} 

void bar() { 
    a += "abc"; 
} 

, 내가 foo는 테스트를 별도로 바 싶다. foo()를 호출하거나 다른 메소드로 바꿀 때 bar가 실행되는 것을 막을 수있는 방법이 있습니까?

답변

8

아무 것도하지 않는 bar()를 재정의하는 하위 클래스를 만듭니다.

+0

클라이언트 코드는 어떻게 생겼습니까? bar()를 재정의하는 클래스를 어떻게 인스턴스화합니까? 따라서 새 클래스를 인스턴스화하는 코드 (또는 팩토리)를 변경해야합니다. 아래에서 말했듯이 문제에 대한 자세한 내용이 필요하다고 생각합니다. 특히 소스가 변경 될 수 있습니다. –

+0

이렇게하기로 결정했다면, 테스트는 테스트 할 클래스와 약간 다른 테스트가 될 것이라는 점에 유의하십시오. 그러면 테스트 커버리지에 구멍이 생길 수 있습니다. – NamshubWriter

+0

@AdrianMouat 이것이 단위 테스트 인 경우 완전히 별도로 테스트 할 클래스를 만들 수 있다고 가정 할 수 있어야합니다. 그렇다면 우리는 간단하게 할 수 있어야합니다 : 새로운 Clazz() {/ * 여기에 덮어 쓰기 * /} 이것은 소스를 변경할 필요가 없음을 의미합니다 – Egwor

1

왜 그렇게하고 싶습니까?

aspect (현명하지 않음)를 사용하여 바이트 코드 레벨에서 코드를 인터셉트 할 수 있습니다. 당신은 bar를 호출하는 객체를 가질 수 있습니다 : void foo(MyBarObject m) { a += "xyx"; m.bar(); }

그러나 제가 말했듯이, 이것이 왜 유용한 지 생각할 수 없습니다. 단위 테스트는 공용 인터페이스를 테스트하기위한 것입니다. bar()가 private이거나 protected 인 경우 호출 및 이후의 어설 션을 통해 foo()를 통해 자동으로 테스트됩니다. foo()와 bar() 둘 다 public이라면, cool, separatley를 테스트하십시오.

실제 사례를 게시 할 수 있습니까? 테스트중인 코드를 변경할 수 있습니까? 기타

1

위 예제는 테스트 가능한 코드가 아니라고 주장 할 수 있습니다. 대신, 코드가 :

void foo() { 
    a += "xyx"; 
} 

void bar() { 
    a += "abc"; 
} 

void fooBar() { 
    foo(); 
    bar(); 
} 

인 경우 단위 테스트가 쉽습니다.

관련 문제