Как Java генерирует подписи для методов? - PullRequest
0 голосов
/ 01 октября 2010

У меня есть Java-класс со статическим финальным методом getAll:

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;        
}

Теперь я хочу передать значение null в качестве значения для Statemant State, так что оно будет позже игнорироваться в коде,Во всяком случае в тестовом сценарии для этого метода у меня есть:

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

, что в свою очередь дает мне NoSuchMethodError .Я не знаю точно, почему это так.Единственное, что я могу себе представить, это то, что ноль, который я передаю, не будет соответствовать сигнатуре вышеуказанного метода.Но как я могу преодолеть это?Я уже думал о перегрузке.Но это просто закончится переписыванием большей части кода.По крайней мере, когда я это делаю, как я думаю.

Есть предложения по этому поводу?

Фил

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)

Ответы [ 2 ]

2 голосов
/ 01 октября 2010

Если метод не существует во время компиляции, то код не будет компилироваться.

Если вы получите NoSuchMethodError во время выполнения, то это предполагает, что версия класса Categoryвы работаете с другой версией класса Category, с которым вы компилируете.

Какова ваша установка - этот класс в том же проекте?Вы копируете в JAR из другого проекта?

0 голосов
/ 06 октября 2010

Реальный ответ

Так что теперь я наконец понял это, и это было не так очевидно, как я ожидал. Я начал задаваться вопросом, когда каждый новый тестовый пример для любого нового метода, который я написал, давал мне NoSuchMethodError . Так что я покопался немного глубже, и вдруг мне пришло в голову: «Я изменил название пакета приложения для Android». Я думал, что это не будет иметь никакого значения для тестового проекта, пока я держу свойства прямо в AndroidManifest.xml, но я ошибаюсь!

Фактически, когда пакет вашего приложения называется com.foo.bar.app, пакет для ваших тестов должен называться com.foo.bar.app.test ! Случилось так, что с моей старой конфигурацией каким-то образом использовались классы, которые находились в папке bin /. Я думал, что они должны были быть удалены, когда я очистил проект, но это не так. Таким образом, все старые тестовые случаи все равно будут проходить, и только новые дадут мне NoSuchMethodError . После того, как я удалил папку bin / вручную, я получил целую кучу ошибок. Затем я переименовал пакет, содержащий контрольные примеры, и полностью очистил / перестроил проект и вуаля, все снова стало нормальным.

Спасибо за все советы! Я действительно ценю вашу помощь, которая просто заставляла меня копаться до сути проблемы. Надеюсь, что это поможет кому-нибудь с такой же проблемой в будущем.

Phil

...