2014-09-10 441 views
4

我有一些麻煩試圖單元測試java代碼,在某些時候調用本地方法。基本上,我試圖使用PowerMockito來模擬最終會調用native的類。我能夠模擬非void方法,但是當我嘗試模擬void返回類型的方法時,我一直在收到編譯錯誤。下面是我想測試代碼的例子:使用PowerMockito模擬方法與void返回類型:「無效的void參數」

public class ClassThatCallsNative { 

    void initObject(ByteBuffer param1, int param2) { 
     //calls native 
    } 

    int getId(int param1) { 
     //calls native 
    } 
} 

我有這樣的代碼在我的測試類:

PowerMockito.when(mClassThatCallsNative.getId(Mockit.anyInt())).thenReturn(0); 

這行代碼彙編就好了,但是下面一行我得到編譯錯誤:

PowerMockito.when(mClassThatCallsNative.initObject(Mockit.any(ByteBuffer.class), anyInt())).doNothing(); 

錯誤消息只是說無效的void參數並指向.initObject。 任何想法我做錯了什麼?

+0

與調用本機並沒有任何關係,你是對的。我只是想爲我遇到的問題添加背景。 – sasfour 2014-09-10 20:00:44

+0

問題中的相關任務上下文,標題和標記中的問題上下文。 – user2864740 2014-09-10 20:05:45

回答

0

爲void的方法,你需要使用下面的一個

PowerMockito.doNothing()。當(mClassThatCallsNative.initObject(Mockit.any(ByteBuffer.class),anyInt()))

+0

同樣的錯誤:這裏不允許使用void類型,對於第一個參數 – sasfour 2014-09-11 22:18:23

0

想通了最後問題是什麼。原來我需要ClassThatCallsNative的實例來模擬它的方法。之前發生的事情是該對象在構造函數調用中被初始化,但是當我創建另一個構造函數時,將ClassThatCallsNative作爲參數,並將實例設置爲該實例,則一切正常。

謝謝你!

+0

另外,模擬void方法的代碼行是這樣的:PowerMockito.doNothing()。when(mClassThatCallsNative).initObject(Matchers。 any(),Mockito。 anyInt()); – sasfour 2014-09-12 15:43:14

0

由於您試圖模擬返回void的方法,因此您無法在when()方法內調用它。這是因爲PowerMockito.when()方法期望T methodCall但是無效,這是編譯失敗的原因。 相反,你應該使用這個語法:

PowerMockito.doNothing().when(mClassThatCallsNative).initObject(any(ByteBuffer.class), anyInt()) 

任何()和anyInt()方法是類的Mockito的一部分。