2014-02-20 2 views
0

한 동료가 다른 정적 메서드 하나가 다른 정적 메서드를 테스트하는 두 가지 정적 메서드를 통해 테스트를 작성하려고했습니다.정적 메서드가 정적 메서드를 호출하는 PowerMock

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ ProcessUtil.class, ImageConverter.class }) 
public class ImageConverterTest { 

    private static final Logger log = Logger.getLogger(ImageConverterTest.class.getName()); 

    @Test 
    public void getImageMagicVersion() throws Exception { 
     PowerMockito.mockStatic(ProcessUtil.class); 

     PowerMockito.when(
       ProcessUtil.execAndReturnResult(Matchers.eq(new String[] { "/usr/bin/convert", "--version" }))) 
       .thenReturn(OLD_IMAGE_MAGIC); 

     String version = ImageConverter.getImageMagicVersion(); 

     verifyStatic(); 

     ProcessUtil.execAndReturnResult(new String[] { "/usr/bin/convert", "--version" }); 

     log.info("Image magic version: " + version); 
     assertEquals(version, OLD_IMAGE_MAGIC); 
    } 
} 

OLD_IMAGE_MAGIC은 정적 최종 문자열입니다.

ImageConverter.getImageMagicVersion에서 볼 수있는 것은 문자열 배열을 구성하여 ProcessUtil.execAndReturnResult에 전달하는 것입니다. ProcessUtil.execAndReturnResult을 조롱하지 않고 실행하면 예외가 발생할 것으로 예상됩니다.

ProcessUtilImageConverter도 모두 최종적인 것이 아니라 모두 정적 메서드를 모두 포함하는 표준 클래스입니다.

우리가보고있는 문제는 반환되는 버전이 null이라는 것입니다. 그렇지만 정적 메소드의 호출을 완료되고 올바르게 검증 할 수도 있습니다. 테스트 중에 ProcessUtil.execAndReturnResult으로 전화하면 올바른 값을 반환합니다.

사용중인 PowerMock의 버전은 1.5.4이며 Mockito (이 코드 샘플에서는 관련이 없지만)와 JUnit 4.11을 함께 사용하고 있습니다. 우리가 잘못하고있는 것에 대한 어떤 생각이라도 이런 종류의 결과로 이어질 것입니까?

+0

테스트 할 클래스가 'ImageConverter'를 조롱하는 이유는 무엇입니까? 게다가, 당신은 조롱을 위해 그것을 준비하지만 결코 모의하지 않습니다. – iberbeu

+0

그들은 그것을 조롱하지 않습니다, 그것은 시험을 위해서 준비 중입니다 (아마 이것을 작동 시키려고 노력 중일 것입니다).하지만 그것을 제거해도 결과에 영향을 미치지는 않습니다. –

+0

여기서 두 가지 일이 발생할 수 있습니다. 1 : 'ProcessUtil '클래스가 최종적이므로 조롱 할 수 없습니다. 2 : 정확한 속성을 가진 'ProcessUtil.execAndReturnResult '메서드를 호출하지 않습니다. – iberbeu

답변

0

문제가 결정되었습니다.

PowerMock는 서로 다른 다음과 같은 치료되었다

ProcessUtil.execAndReturnResult(String [] values) 

ProcessUtil.execAndReturnResult(String... values) 

문제는 우리가 가변 인자 매처를 사용하지 않고 있다고했지만, 오히려 직선 배열 일치. vararg 매처로 전환하거나 다른 데이터 유형으로 전환하면 문제가 해결됩니다.

관련 문제