2011-02-06 5 views
10

이 같은 클래스가 있습니다. 난 toString() 메서드를 테스트 junit 테스트를 작성하고 싶습니다. 이를 위해 getBar() 메소드를 조롱하고 원래 toString() 메소드를 실행하여 출력을 확인해야합니다.테스트 코드는

내 첫 번째 생각은 이것이 불가능해야한다는 것이었지만 그 다음에는 기능 목록에 따라 최종 클래스와 기본 메서드를 테스트하는 것을 지원하는 PowerMock을 발견했습니다. 그러나 지금까지 나는 그것을 성공하지 못했습니다. 내가 관리 한 가장 좋은 점은 완전한 클래스를 조롱하는 것이었지만, 테스트에서는 그다지 이해하지 못하는 실제 메소드 대신에 toString() 메쏘드를 테스트했다.

그래서 PowerMock을 사용하여 위의 toString() 메서드를 테스트 할 수 있습니까? 내가 Mockito와 함께 PowerMock을 사용하는 것이 더 좋지만, 가능하지 않다면 대신 EasyMock을 사용하는 데 문제가 없습니다.

답변

8

발견. 내가하고있는 방식이 옳았다. 내가 놓친 유일한 것은 mock 객체가 toString이 호출되었을 때 원래의 메소드를 호출하도록하는 것이었다. 그래서 다음과 같이 작동

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ Foo.class }) 
public class FooTest 
{ 
    @Test 
    public void testToString() throws Exception 
    { 
     Foo foo = mock(Foo.class); 
     when(foo.getBar()).thenReturn(42); 
     when(foo.toString()).thenCallRealMethod(); 
     assertEquals("Bar: 42", foo.toString()); 
    } 
} 
+1

HI ... 나는 추가 은어 때 "()".. 왜 ..? Easymock을 사용하여 제발 말해 주시겠습니까 –

1

또는 사용 전략 패턴 : 단위 테스트, 모의 IBarStrategy 인스턴스를 주입 할 때, 당신은 클래스 Foo을 테스트 할 수

public final class Foo 
    { 
     public IBarStrategy barStrategy; 

     ...... 
    } 

    interface IBarStrategy{ 
     int getBar(); 
    } 

.

+3

의존성 주입은 코드 재사용과 모듈성을위한 좋은 점입니다.하지만 이것이 필요하지 않은 경우 왜 복잡성을 높이고 테스트를 위해 클래스의 API를 느슨하게해야합니까? 하지만 여기서 중요한 것은 아닙니다. 그래서 테스트 대상을 변경할 수 없으므로 기본 메소드를 인터페이스로 추출 할 수 없다고 가정 해 봅시다. – kayahr

+0

이렇게하면 실제로 복잡성이 증가하지 않습니다. 이 일을하지 않는 것만으로도 숨어있는 복잡성. 당신은 테스트 가능성을 위해 다음과 같이 디자인해야합니다. – Will

3

또는 부분 동적 JMockit를 사용를 조롱 :

import org.junit.*; 
import mockit.*; 

public class FooTest 
{ 
    @Test 
    public void testToString() 
    { 
     final Foo foo = new Foo(); 
     new Expectations(foo) {{ foo.getBar(); result = 42; }}; 

     assertEquals("Bar: 42", foo.toString()); 
    } 
}