Java如何为方法生成签名?

时间:2010-10-01 13:43:25

标签: java android junit method-signature

我有一个带有静态最终方法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;        
}

现在我想将null作为where statemant的值,以便稍后在代码中被忽略。无论如何,在这个方法的测试用例中,我有:

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

然后反过来给我一个 NoSuchMethodError 。我不知道为什么会那样做。我唯一可以想象的是,我输入的null与上述方法的签名不匹配。但是我怎么能克服这个呢?我已经想过重载了。但这只会重写大部分代码。至少当我这样做时,我的想法。

有关于此的任何建议吗?

菲尔

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)

2 个答案:

答案 0 :(得分:2)

如果该方法在编译时不存在,则代码将无法编译。

如果在运行时获得NoSuchMethodError,则表明您运行的Category类的版本与您正在编译的Category类的版本不同反对。

你的设置是什么样的 - 这个课程在同一个项目中?你是从另一个项目复制JAR吗?

答案 1 :(得分:0)

真正的答案

所以我现在终于弄清楚它并没有我想象的那么明显。我开始想知道,当我编写的任何新方法的每个新测试用例都会给我 NoSuchMethodError 。所以我深入挖掘了一下,突然之间我突然意识到:“我改变了android应用程序的包名”。我认为这对测试项目没有任何影响,只要我在AndroidManifest.xml中保留了属性,但我错了!

实际上,当您的应用程序包名为com.foo.bar.app时,您的测试包必须命名为 com.foo.bar.app.test !发生了什么,用我的旧配置以某种方式使用了bin /文件夹中的类。我想,当我清理项目时它们应该被删除但是它们不是。这样所有旧的测试用例仍然会通过,只有新的测试用例会给我 NoSuchMethodError 。手动删除bin /文件夹后,我遇到了一大堆错误。然后,我重新命名了包含测试用例的包,并对项目进行了全面清理/重建,然后再次恢复正常。

感谢您的所有提示!我真的很感谢你的帮助,让我深入挖掘问题的根源。希望这将有助于将来遇到同样问题的人。

菲尔