2012-06-27 61 views
10

當我試圖單元測試JDialog對象中的某些方法時,出現NullPointerException。我必須初始化對話框的父的模擬版本,以及將用於(除了調用靜態方法的另一個類的代碼如下:Powermock,Mockito nullpointerexception當調用超級()時JDialog

​​

所要求的代碼構建對話是在這裏:

StructureCompareDialog(IControlFrame controlFrame) 
{ 
super((Frame) controlFrame, "title", true); 
... 
} 

時超構造函數被調用,我將最終得到在java.awt.Window.addOwnerWindow(Window.java:2525)的NullPointerError」

void addOwnedWindow(WeakReference weakWindow) { 
    if (weakWindow != null) { 
    synchronized(ownedWindowList) { ***<<------ offending line*** 
     // this if statement should really be an assert, but we don't 
     // have asserts... 
     if (!ownedWindowList.contains(weakWindow)) { 
     ownedWindowList.addElement(weakWindow); 
     } 
    } 
    } 
} 

我知道我正在混合靜態和擺動有毒漩渦gui,但我別無選擇。我被賦予了將現有代碼一起進行單元測試的指令。我不知道發生了什麼問題。

謝謝

+0

你有沒有得到這個工作:

private class EmptyControlFrame extends JFrame implements IControlFrame { @Override public JFrame getFrame() { return null; } // return null for any other overrides from IControlFrame } 
在您的設置()

呢?如果是這樣,你介意發佈解決方案嗎? – glenneroo

+0

Starnge你正在'synchronized(ownedWindowList)'獲得空指針。如果您檢查Window.java中的'ownedWindowList'數據成員,它已被實例化並且從未再次分配給null。 想知道什麼可能使這個數據成員爲空。 你能檢查你的代碼是否訪問了這個數據成員(使用反射)並且已經改爲null。儘可能少的情況下,這個數據成員需要手動更改,但更好確保。 –

+0

@glenneroo,我認爲把賞金放在這裏而不是用自己的代碼創建新問題是一個錯誤。你能否提供一些細節,比如你做了什麼以及堆棧追蹤異常。 – SergGr

回答

5

看起來很棘手!基本上你將不得不找到所有的正在呼籲controlFrame作爲構造的一部分的方法,然後撒上一些呼叫

when(controlFrame.methodCalled()).thenReturn(somethingSensible); 

如果這看起來像一個艱難的苦差事,怎麼樣努力創建一個IControlFrame的默認實現,您將其創建爲測試setUp()的一部分並使用該模擬的instea。

前段時間我有一個類似的問題,我試圖單元測試一個Spring JMS監聽器。無論是正確的還是錯誤的,我通過創建自己的默認實現DefaultMessageListenerContainer得到了一個工作解決方案,它給了我類似的問題,你正在描述。我的解決方案涉及擴大與我自己的測試特定版本的真正落實這看上去像這樣

/** 
* Empty mocked class to allow unit testing with spring references to a 
* DefaultMessageListenerContainer. The functionality on this class should never be 
* called so just override and do nothing. 
*/ 
public class MockDefaultMessageListenerContainer extends DefaultMessageListenerContainer { 

    public MockDefaultMessageListenerContainer() { 
    } 

    public void afterPropertiesSet() { 
    } 

    @Override 
    protected Connection createConnection() throws JMSException { 
     return null; 
    } 
} 

在我的例子我能得到我的測試通過傳遞迴null值的problemmatic的createConnection()方法運行。也許同樣的方法可以幫助你。

0

ownedWIndowListtransientjava.awt.Window類。您的JDialog的實例是否已序列化?如果是這樣,你可能需要使用readObject(java.io.ObjectStream)方法從Serializable接口重新初始化ownedWIndowList

0

我不知道你的IControlFrame是什麼樣子,但不得傳遞嘲笑Frame超()不工作。我不得不實例我自己的版本:

controlFrame = new EmptyControlFrame(); 
相關問題