11

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

@RunWith( PowerMockRunner.class )
@PrepareForTest( ControlFileUtilities.class )
public class StructCompDlgTest 
{
  @Before
  public void setUp() throws Exception
  {
    controlFrame    = org.mockito.Mockito.mock( ControlFrame.class );
    structCmpDlg    = new StructureCompareDialog( controlFrame );
    serverPipeline  = org.mockito.Mockito.mock( ServerPipeline.class );
  }
...
}

ダイアログを構築するために呼び出されるコードは次のとおりです。

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を混同していることは知っていますが、選択の余地はありません。いくつかのユニットテストを既存のコードと一緒にスローするように指示されました。何が悪いのかわかりません。

ありがとう

4

3 に答える 3

5

トリッキーに見えます!基本的に、コンストラクターの一部として呼び出されているすべてのメソッドを見つけてから、controlFrameいくつかの呼び出しを振りかける必要があります。

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

これが難しい雑用のように見える場合はIControlFrame、テスト setUp() の一部として作成したデフォルトの実装を作成し、それをモックの代わりに使用してみませんか。

少し前に、春の 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、問題のある createConnection() メソッドの値を返すことで、テストを実行することができました。おそらく、同じアプローチがあなたを助けることができます。

于 2012-07-03T14:53:29.623 に答える