一個同事試圖通過兩個靜態方法編寫測試,其中一個靜態方法稱爲另一個。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'類是final的,因此不可嘲弄。 2:方法'ProcessUtil.execAndReturnResult'沒有被這些確切的屬性調用 – iberbeu