2014-02-20 146 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'類是final的,因此不可嘲弄。 2:方法'ProcessUtil.execAndReturnResult'沒有被這些確切的屬性調用 – iberbeu

回答

0

我們確定了這個問題。

PowerMock處理下面的不同:

ProcessUtil.execAndReturnResult(String [] values) 

ProcessUtil.execAndReturnResult(String... values) 

的問題是,我們並沒有使用可變參數匹配,而是直陣列中的比賽。切換到可變參數匹配器(或切換到不同的數據類型)解決了這個問題。