1

たとえば、単体テスト用に Java3D クラスをモックアウトしようとしています。

mock(VirtualUniverse.class);

また

mock(Canvas3D.class);

残念ながら、VirtualUniverse (Canvas3D からも参照されます) には、メソッドを含む MasterControl への静的参照があります。

static void loadLibraries(){
...
}

モック中に呼び出され、外部ライブラリをロードしようとしますが、これはまさに私が避けようとしているものです。

Java3D フレームワークを利用するアプリケーションに適用されるモックの一般的なアプローチとして、人々が何を使用しているかを聞きたいと思います。特に、ユニバースを処理するための満足のいくアプローチを見つけた場合はなおさらです。

アップデート:

この質問をした後、いくつかのことが起こりました。1 つは、Java3D と JavaFX の状態について詳しく学んだことです。Java3D に関する作業は、JavaFX に集中することを優先して、現在停止されているようです。また、JavaFX には、現時点で 2011 年第 3 四半期に Java API が含まれる予定です。私たちの既存のコードはシーングラフ ベースなので、他のシーングラフ パラダイム ツールを探し回ったところ、うまく機能しそうな jMonkeyEngine (jME) にたどり着きました。

jME のアプリケーション クラスは構成よりも継承を優先しますが (com.jme3.app.SimpleApplication を参照)、デリゲータを継承階層に挿入するのは簡単だったので、より TDD 対応の方法で独自のアプリケーションを作成できました。また、jME チームは静的動作の使用を回避することに長けています。これは、UT のコンポーネントをモック アウトする作業に役立ちます。

したがって、私は、彼が代表団の考えに賛成しているという根拠に基づいて、Zsolt の回答を受け入れます。

4

1 に答える 1

1

残念ながら、あなたの質問に対する答えはありません。テスト中に予期しない静的呼び出しを回避したい場合 (使用しているモッキング フレームワークには依存しません)、呼び出しをVirtualUniverse.

例えば:

public class VirtualUniverseWrapper {
  private VirtualUniverse virtualUniverse;
  // ...
  public Object foo() {
    // simple delegation instead of inheritance, because your class might be final
    return virtualUniverse.foo();
  }
}

を使えばVirtualUniverseWrapperモックできます。コードが少し奇妙になるかもしれませんが、動作します。ラッパーとファクトリを組み合わせたコード ベースでも同じアプローチを使用しています。

于 2011-02-23T23:08:57.203 に答える