2010-10-01 4 views
0

У меня есть класс Java со статическим методом конечного 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;   
} 

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

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

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

Любые предложения по этому вопросу?

Phil

P.S. Это трассировки стека я получаю:

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) 
+0

Посмотрите на выход логарифма. Было исключение, вызванное каким-либо другим сбоем, например. ошибка проверки? – fadden

ответ

0

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

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

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

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

Phil

2

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

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

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

+0

+1 - но это не просто «предложить» это. AFAIK, нет другого правдоподобного объяснения. –

+0

Класс категории находится в основном проекте (приложение для Android). Тесты проходят в тестовом проекте, который напрямую связан с основным приложением. Это как-то странно, потому что все остальные тесты проходят без проблем. Кроме того, я не делаю ничего, как изменение класса во время выполнения. Это простой класс модели. Сохранение данных и логика для управления данными. – philgiese

+0

@ Stephen Я не люблю говорить в терминах абсолютов в 0,1% -ном шансе, о котором я не думал ни о чем, или о том, что у philgies есть какая-то неудобная настройка :) –