【问题标题】:Android unit test skipping lines in tested classAndroid单元测试在测试类中跳过行
【发布时间】: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


【解决方案1】:

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

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 语句从未被命中。

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 2015-07-19
    • 1970-01-01
    • 2011-02-10
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多