한 동료가 다른 정적 메서드 하나가 다른 정적 메서드를 테스트하는 두 가지 정적 메서드를 통해 테스트를 작성하려고했습니다.정적 메서드가 정적 메서드를 호출하는 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
을 조롱하지 않고 실행하면 예외가 발생할 것으로 예상됩니다.
ProcessUtil
도 ImageConverter
도 모두 최종적인 것이 아니라 모두 정적 메서드를 모두 포함하는 표준 클래스입니다.
우리가보고있는 문제는 반환되는 버전이 null
이라는 것입니다. 그렇지만 정적 메소드의 호출을 완료되고 올바르게 검증 할 수도 있습니다. 테스트 중에 ProcessUtil.execAndReturnResult
으로 전화하면 올바른 값을 반환합니다.
사용중인 PowerMock의 버전은 1.5.4이며 Mockito (이 코드 샘플에서는 관련이 없지만)와 JUnit 4.11을 함께 사용하고 있습니다. 우리가 잘못하고있는 것에 대한 어떤 생각이라도 이런 종류의 결과로 이어질 것입니까?
테스트 할 클래스가 'ImageConverter'를 조롱하는 이유는 무엇입니까? 게다가, 당신은 조롱을 위해 그것을 준비하지만 결코 모의하지 않습니다. – iberbeu
그들은 그것을 조롱하지 않습니다, 그것은 시험을 위해서 준비 중입니다 (아마 이것을 작동 시키려고 노력 중일 것입니다).하지만 그것을 제거해도 결과에 영향을 미치지는 않습니다. –
여기서 두 가지 일이 발생할 수 있습니다. 1 : 'ProcessUtil '클래스가 최종적이므로 조롱 할 수 없습니다. 2 : 정확한 속성을 가진 'ProcessUtil.execAndReturnResult '메서드를 호출하지 않습니다. – iberbeu