【发布时间】:2014-08-29 13:04:29
【问题描述】:
我有一个具有以下方法的类:
/**
* @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 作为 Eclipse Android SDK 的 Android Junit 测试来运行它。当我第一次开始运行它时,我的测试失败了。当我单步执行它时,它正在处理异常并运行更新(标记为第 3 行)。
嗯...想知道为什么会这样。所以我添加了日志信息并重新运行了单元测试。当我单步执行代码时,它直接转到调试器中的第 3 行,而不打印堆栈跟踪。我觉得很奇怪,但这可能只是一些卡在 bin 目录中的代码。所以我运行一个干净的项目并再次运行它。完全相同的结果。
我认为这是一个把戏。我在第 3 行和第 1 行设置断点并重新运行测试。测试直接跳到第 3 行,没有碰到第 1 行的断点。
嗯....可能卡在bin目录中的代码,eclipse无法清理干净。我以前见过这种情况。所以,我停止 eclipse,进入 bin 目录,并手动删除那里的所有文件。然后我重新启动 eclipse 刷新文件系统,运行一个干净的项目,然后重新运行我的测试。没有变化。
WTF?
啊哈!我想,代码卡在手机上。我卸载了我们所有的软件,包括手机上的测试应用程序。项目->清理并重新运行测试。还是没有变化。
WTFF?
所以,我想,我已经在这款手机上进行了很多测试,一些代码片段卡在了某处。我使用 Android 工具并构建了一个新的模拟器。 Project->Clean,在模拟器上运行测试。结果完全相同。
FWTFF?
所以,我漫无目的地想了一会儿,不知道接下来要尝试什么,所以我在这里发帖。
发布后,我与一位同事交谈并向他展示了我遇到的问题。他的日食设置与我的略有不同。他使用了我的来源并准确地重新创建了问题。
FFFFF。
【问题讨论】:
-
你使用 Proguard 吗?也许这些行已被 Proguard 删除?
-
由于我不知道Proguard是什么,所以我要说不。
-
Proguard 对 java 代码进行混淆和优化,并自动包含在使用 Android SDK 创建的 Android 项目中。 developer.android.com/tools/help/proguard.html 。我并不是说我确定这是你的问题,但它可能是。
-
@Simon 从stackoverflow.com/questions/10642030/… 看来,必须启用 proguard 才能运行。我在我的 project.properties 中注释掉了 proguard 行,所以不能这样。
标签: java android eclipse junit