2012-06-27 10 views
10

JDialogオブジェクトのいくつかのメソッドを単体テストしようとすると、NullPointerExceptionが発生します。私は、ダイアログの親のモックバージョンと同様に、静的メソッドを呼び出すことに加えて、(使用される別のクラスを初期化する必要があり、次のようにコードは次のとおりです。Powermock、super()JDialogを呼び出すときにnullポイントを受け取るJDialog

​​

のために呼び出されるコードをダイアログを構築することはここにある:

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

スーパーコンストラクタが、私は最終的にjava.awt.Window.addOwnerWindowでNullPointerError(Window.java:2525)を取得する呼び出されたときに」

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

あなたは今までこの作業を取得しましたか?もしそうなら、ソリューションを投稿しても構いませんか? – glenneroo

+0

Starngeあなたは 'synchronized(ownedWindowList)'にヌルポインタを取得しています。 Window.javaで 'ownedWindowList'データメンバをチェックすると、それはインスタンス化されており、決してnullに再び割り当てられません。 このデータメンバーをnullにする可能性があることが不思議です。 このデータメンバーが(Reflectionを使用して)アクセスされ、nullに変更されている場合、コードをチェックインできますか?このデータメンバを手動で変更する必要があるが、確実に確認する必要がある場合は、可能な限り少なくしてください。 –

+0

@glenneroo、私は自分のコードで新しい質問を作成するのではなく、ここに奨励金を入れるのは間違いだと思います。あなたがしていることのようないくつかの詳細を提供し、あなたが得る例外のトレースをスタックすることができますか? – SergGr

答えて

5

ルックストリッキー!基本的に、あなたは、コンストラクタの一部としてcontrolFrameに呼び出されているメソッドのすべてを見つけるために必要があるとしている、これはしようについてどのように、困難な雑用のように探しているなら、

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

にいくつかの呼び出しを振りかけますの既定の実装を作成します。この実装は、テストsetUp()の一部として作成し、そのInsteaのモックを使用します。

私は春のJMSリスナーを単体テストしようとしていましたが、これまでと同じ問題がありました。間違いなく、DefaultMessageListenerContainerの独自のデフォルト実装を作成することで、私が実際に解決していることは、あなたが記述しているものと同様の問題を引き起こしていました。私のソリューションは、私はproblemmaticのcreateConnection()メソッドのnull値をバック渡すことによって実行されている私のテストを得ることができた私の例では、この

/** 
* 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; 
    } 
} 

ように見えた私自身のテスト特定のバージョンとの実際の実装を拡張関与しました。同じアプローチがあなたを助けるかもしれません。

0

ownedWIndowListは、java.awt.Windowクラスのtransientである。 JDialogのインスタンスがシリアル化されていますか?もしそうなら、あなたはownedWIndowList

0

は、私はあなたのIControlFrameがどのようなものか知っていない再初期化するためにSerializableインタフェースからreadObject(java.io.ObjectStream)メソッドを使用する必要があるかもしれませんが、スーパーへの嘲笑Frame()が動作しません渡します。 )(あなたのセットアップで次に

private class EmptyControlFrame extends JFrame implements IControlFrame { 

    @Override 
    public JFrame getFrame() { 
     return null; 
    } 

    // return null for any other overrides from IControlFrame 
} 

:私は私の独自のバージョンをインスタンス化する必要がありました

controlFrame = new EmptyControlFrame(); 
関連する問題