0

静的なfinalメソッドgetAllを持つJavaクラスがあります。

public static final Vector<Category> getAll(Context context, ContentValues where) {
    ArrayList<Integer> IDs = null;

    if(where != null && where.containsKey(DatabaseAdapter.KEY_PRODUCT)) {
        IDs = OvertureItem.getAll(context, DatabaseAdapter.TABLE_PRODUCT_CATEGORY, new String[] { DatabaseAdapter.KEY_CATEGORY }, where);
    } else {
        IDs = OvertureItem.getAll(context, DatabaseAdapter.TABLE_CATEGORIES, where);
    }

    Vector<Category> categories = new Vector<Category>();

    for(Integer id: IDs) {
        categories.add(Category.get(context, id));
    }

    return categories;        
}

ここで、where statemantの値としてnullを渡して、コードの後半で無視されるようにします。とにかく、このメソッドのテストケースには次のようなものがあります。

Vector<Category> categories = Category.getAll(context, null);

次に、NoSuchMethodErrorが発生します。なぜそうなるのか正確にはわかりません。私が想像できる唯一のことは、私が渡したnullが上記のメソッドのシグネチャと一致しないということです。しかし、どうすればこれを克服できますか?私はすでにオーバーロードについて考えました。しかし、これはほとんどのコードを書き直すことで終わります。少なくとも私がそれをするとき、私はどう思いますか。

それについて何か提案はありますか?

フィル

PSこれは私が取得したスタックトレースです:

java.lang.NoSuchMethodError: com.sap.catalogue.model.Category.getAll
at com.sap.overture.test.model.CategoryTest.testGetAll(CategoryTest.java:59)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
4

2 に答える 2

2

メソッドがコンパイル時に存在しなかった場合、コードはコンパイルされません。

NoSuchMethodError実行時に取得する場合、これは、実行しているクラスのバージョンが、コンパイルしているクラスCategoryのバージョンとは異なることを示しています。Category

あなたのセットアップはどのようなものですか?このクラスは同じプロジェクトにありますか?別のプロジェクトからJARをコピーしていますか?

于 2010-10-01T13:48:57.957 に答える
0

本当の答え

だから私はついにそれを理解しました、そしてそれは私が期待したほど明白ではありませんでした。私が書いた新しいメソッドのすべての新しいテストケースが私にNoSuchMethodErrorを与えるとき、私は疑問に思い始めました。そこで、もう少し深く掘り下げてみると、突然、「Androidアプリケーションのパッケージ名を変更した」と思い浮かびました。AndroidManifest.xmlでプロパティを正しく保持している限り、これはテストプロジェクトに影響を与えないと思いましたが、間違っていました。

実際、アプリケーションパッケージの名前がcom.foo.bar.appの場合、テスト用のパッケージの名前はcom.foo.bar.app.testである必要があります。何が起こったのかというと、私の古い構成では、どういうわけか、bin/フォルダーにあるクラスが使用されていました。プロジェクトをクリーンアップしたときに削除されるべきだと思いましたが、削除されませんでした。このようにして、古いテストケースはすべて合格し、新しいテストケースだけがNoSuchMethodErrorを返します。bin /フォルダーを手動で削除した後、大量のエラーが発生しました。次に、テストケースを保持しているパッケージの名前を変更し、プロジェクトで完全なクリーン/再構築を実行しました。すべてが再び正常に戻りました。

すべてのヒントをありがとう!問題の根底を掘り下げてくれたあなたの助けに本当に感謝しています。これが将来同じ問題を抱えている人に役立つことを願っています。

フィル

于 2010-10-06T08:17:00.990 に答える