4

PowerMock を使用して の静的メソッドをモックしていますが、JRE は初期化時に独自のパッケージとクラスの整合性をチェックするJOptionPaneため、あまり準拠していないようです。java.lang.VerifyError

私はいくつかの回避策を持っていますが、それらのどれにもあまり満足していません:

  • オブジェクト ラッパーを作成し、必要なメソッド (など)JOptionPaneのインターフェイスを提供して、テスト用にモックまたはスタブを挿入できるようにします。showInputDialogラッパーメソッドをカバーする必要があるため、これは問題を別の場所に移動するだけですが、少なくともそれらはロジックから分離されます。

  • クラス参照の代わりにインスタンスを使用して、JOptionPaneそのメソッドを呼び出します (クラスは最終的なものではないため、インスタンスのモックに問題はないと思います)。欠点は、「インスタンス変数で静的メソッドを呼び出しています」という種類の警告がたくさん表示されることですが、それは代償です。

  • まったくモックしないで、それを処理するために入力イベントを発生させるためにJOptionPane使用します。Robotこれは非常に面倒で、あまり堅牢ではない可能性があります...それに加えて、私は内部ダイアログを使用しており、 、 などを設定するために余分な作業が必要JDesktopPaneですJInternalFrame

他のアイデアや提案はありますか?

ありがとう!

更新:ちなみに、私はインスタンスをモックしようとしましたJOptionPane 、メソッドディスパッチャーがインスタンスを無視して、以前に存在していた静的メソッドを直接選択しているようです(結局のところ、それは理にかなっています)。そのため、2番目のオプションは破棄されます。

4

1 に答える 1

2
  • Write a wrapper for JOptionPane- これは間違いなく最も堅牢なオプションであり、便利な簡易メソッドを自分で作成することもできます。私はこれを選びます。私や他のほとんどの開発者と同様に、プロジェクトのどこかに既に GUI ヘルパー クラスがあれば、そこに行くことができます。

  • インスタンスを使用してください - 悪い解決策ではありませんが、単一の静的メソッドへの呼び出しほど管理が容易ではありません。追加された複雑さがそれだけの価値があるとは言えません。

  • a を使用しRobotて入力をモックします-はい、それは私には非常に壊れやすいように聞こえます。JOptionPaneその時点で の内部構造と実装の詳細に依存するようになり、これは適切な場所ではありません。JOptionPaneの動作とボタンの順序は、異なるルック アンド フィール (つまり、OK、キャンセル、キャンセル、OK) によっても異なる場合があります。最後に、これはヘッドレス環境では機能しません (ただしJOptionPane、テストで既に s を使用していて、常にデスクトップ マシンでテストする予定がある場合は問題ありません)。

于 2011-03-29T10:46:31.920 に答える