2

jMockit を使用して netscape.javascript.JSObject への呼び出しをスタブ化しようとしていますが、これは残念ながらいくつかのネイティブ メソッドを含む抽象クラスであり、どちらも jMockit ではうまく機能しません。jMockitまたはプレーンJavaを使用してこれをスタブ化する方法はありますか(可能であれば新しいライブラリを導入する必要はありません)? モックを挿入しようとしているコードは次のようになります (質問しないでください)。

JSObject win = JSObject.getWindow(this);
String someVal = (String) win.call("foo", new String[] {""});

残念ながら、問題のコードを変更することはできません (繰り返しますが、聞かないでください)。そのため、何らかの種類の単体テストを実行できる唯一の方法は、スタブアウトする方法を理解するか、または別の方法で呼び出しを排除することです。 JS オブジェクト。私の現在のモック実装は、getWindowへの呼び出しに対してそれ自体の新しいインスタンスを返し、呼び出す呼び出しに対して定数文字列を返しますが、もちろん、実行時に不平を言って失敗します

クラスの再定義に失敗しました: メソッド修飾子を変更しようとしました

私の調査から、ネイティブメソッドをモックしようとしていることを発見しました。

編集:ターゲットプラットフォームのため、ビルド/テストにJDK 1.5を使用する必要があるため、1.5でソリューションを実行できる必要があります。

4

2 に答える 2

3

JMockit のどのバージョンを使用していますか? thisによると、問題なくネイティブ メソッドをモックできるはずです。

@Test
public void mockNativeMethod() {
    new MockUp<Runtime>() {
        @Mock
        @SuppressWarnings("unused")
        int availableProcessors() {
            return 999;
        }
    };
    assertEquals(999, Runtime.getRuntime().availableProcessors());
}

編集: ご指摘のとおり、これは Java 1.5 では機能しません。唯一の解決策は、単にパススルーとして動作するデコレータでネイティブ オブジェクトをラップすることだと思います。それは少し頭の痛い問題ですが、嘲笑/傍受などを許可します.

于 2009-12-01T20:05:47.417 に答える
1

Brian が指摘したように、JMockit はネイティブ メソッドのモックをサポートしています。(以下のテストに示されている Expectations API もサポートしています。)

@Test // this only works under JDK 1.6+; JDK 1.5 does not support redefining natives
public void mockNativeMethod()
{
   new Expectations()
   {
      final System system = null;

      {
         System.nanoTime(); returns(0L);
      }
   };

   assertEquals(0, System.nanoTime());
}

ただし問題は、JDK 1.5 の JVMTI 実装があまり成熟しておらず、nativeメソッドの再定義をサポートしていないことです。

プロダクション コードを JDK 1.5 環境にデプロイする必要があることは理解していますが、それが開発環境で JDK 1.6 を使用する妨げにはなりません。通常、JDK 1.6 でテストを実行することは完全に安全で簡単であり、JDK 1.6 コンパイラを使用してすべてのソース コードをコンパイルすることさえできます。javac の「ターゲット」を「1.5」に指定するだけです。Eclipse では、「プロジェクト プロパティ -> Java コンパイラ」の下に「JDK 準拠」構成があります。

于 2009-12-05T01:23:24.000 に答える