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行,所以不能是这样。