Java Android单元测试在测试类中跳过行

Java Android单元测试在测试类中跳过行,java,android,eclipse,junit,Java,Android,Eclipse,Junit,我有一个使用以下方法的类: /** * @param contact * @return */ public long create(Contact contact) { ContentValues contactValues = buildContentValues(contact); try { return getDb().insert(CONTACTS_TABLE_NAME, null, contactValues); } catch (S

我有一个使用以下方法的类:

/**
 * @param contact
 * @return
 */
public long create(Contact contact) {
    ContentValues contactValues = buildContentValues(contact);

    try {
        return getDb().insert(CONTACTS_TABLE_NAME, null, contactValues);
    } catch (SQLiteConstraintException sce) {
        sce.printStackTrace(); // line 1
        log.debug("Error inserting:" + contact, sce); //line2
        return getDb().update(CONTACTS_TABLE_NAME, contactValues, COLUMN_ID + "=" + contact.userInfo.id, null); //line 3
    }
}
我使用AndroidTestCase作为来自EclipseAndroidSDK的AndroidJUnit测试来运行它。当我第一次开始运行它时,我的测试失败了。当我逐步完成它时,它正在处理异常并运行更新(标记为第3行)

嗯…不知道为什么。所以我添加了日志信息并重新运行了单元测试。当我单步执行代码时,它直接进入调试器中的第3行,而不打印堆栈跟踪。奇怪,我想,但这可能只是一些代码卡在bin目录中。所以我运行了一个项目,然后再次运行。完全相同的结果

我想这是个骗局。我在第3行和第1行设置了一个断点,然后重新运行测试。测试直接跳到第3行,而不触及第1行断点

嗯……可能代码卡在bin目录中,eclipse无法用干净的代码删除它。我以前见过这种情况。因此,我停止eclipse,转到bin目录,手动删除那里的所有文件。然后重新启动eclipse刷新文件系统,运行项目清理,然后重新运行测试。没有变化

WTF

啊哈!我想,密码卡在电话里了。我卸载了所有软件,包括手机上的测试应用程序。项目->清理并重新运行测试。还是没有变化

WTFF

所以,我想,我已经在这部手机上测试了很多次了,一些代码碎片卡在了里面的某个地方。我使用Android工具构建了一个新的模拟器。Project->Clean,在模拟器上运行测试。完全相同的结果

FWTFF

所以,我漫无目的地想了一会儿,不知道下一步该做什么,所以我在这里发帖

发布后,我与一位同事交谈,向他展示了我遇到的问题。他的eclipse设置与我的稍有不同。他使用了我的来源,准确地重新创建了问题


FFFFF.

我认为缺陷是由于某种缺陷造成的视错觉。我将代码更改为:

public long create(Contact contact) {
    ContentValues contactValues = buildContentValues(contact);

    long result;    
    try {
        result = getDb().insert(CONTACTS_TABLE_NAME, null, contactValues);
    } catch (SQLiteConstraintException sce) {
        sce.printStackTrace();
        log.debug("Error inserting:" + contact, sce);
        result = getDb().update(CONTACTS_TABLE_NAME, contactValues, COLUMN_ID + "=" + contact.userInfo.id, null);
    }

    return result;
}

而且catch语句从未被击中。

您使用Proguard吗?也许这些行已经被Proguard删除了?因为我不知道什么是Proguard,我想说不。Proguard混淆并优化java代码,并自动包含在使用Android SDK创建的Android项目中。我不是说我确定这是你的问题,但它可能是。@Simon从那个proguard看来必须启用才能运行。我已经在project.properties中注释掉了proguard行,所以不能是这样。