JUnit 测试期间的 Android 2.3.x 静态字段问题

标签 android dalvik cts

我在对 Android 2.3.x 进行 CTS R12 测试时发现了一个问题。 在媒体压力测试中,案例均因文件异常而失败。 这是由于在测试用例期间静态变量“FILE_PATH”为空引起的。 我发现它在装有 Android 2.3.6 的 NexusOne/NexusS 上 100% 可重现。

我也写了一个很简单的测试工程来测试一下,下面附上代码。

Activity 代码:

package com.hw.hello;

import android.app.Activity;
import android.os.Bundle;

public class HelloActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

测试用例代码:

package com.hw.hello.test;

import com.hw.hello.HelloActivity;

import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;

public class HelloTest extends ActivityInstrumentationTestCase2<HelloActivity> {

    private static final String STR;

    static {
        STR = "XXXXXX";
    }

    public HelloTest() {
        super("com.hw.hello", HelloActivity.class);
    }

    @Override
    public void setUp() {

    }

    public void test1() {
        Log.d("111111", "STR="+STR);
    }

    public void test2() {
        Log.d("222222", "STR="+STR);
    }
}

当你运行它时,你会发现结果是:

02-24 01:24:04.280: D/111111(28075): STR=XXXXXX

02-24 01:24:04.327: D/222222(28075): STR=null

我知道 Google 已经在 ICS 上解决了这个问题。 但是我发现 Dalvik VM 的变化太大了,要合并到 2.3.7。 我该怎么做才能在 2.3.7 上修复此问题以通过 CTS R12?

============================================= =================================

我无法在 8 小时内自己回答我的问题。 所以我在这里有答案:

我的法国同事给了我找到最终解决方案的提示: 我发现 ActivityTestCase.java 的 ICS 源代码有一些变化

变化是一个附加条件: && (field.getModifiers() & Modifier.FINAL) == 0

@Override
 protected void scrubClass(final Class<?> testCaseClass)
 throws IllegalAccessException {
     final Field[] fields = getClass().getDeclaredFields();
     for (Field field : fields) {
         final Class<?> fieldClass = field.getDeclaringClass();
         if (testCaseClass.isAssignableFrom(fieldClass) && !field.getType().isPrimitive()
                 && (field.getModifiers() & Modifier.FINAL) == 0) {
             try {
                 field.setAccessible(true);
                 field.set(this, null);
             } catch (Exception e) {
                 android.util.Log.d("TestCase", "Error: Could not nullify field!");
             }

             if (field.get(this) != null) {
                 android.util.Log.d("TestCase", "Error: Could not nullify field!");
             }
         }
     }
 }

我将这部分代码放到我的测试用例类中以覆盖父类(super class)的方法,现在问题已经解决。

最佳答案

应@Malcolm 的要求

我无法在 8 小时内自己回答我的问题。所以我在这里有答案:

我的法国同事给了我找到最终解决方案的提示:我发现 ActivityTestCase.java 的 ICS 源代码有一些变化

变化是增加了条件:&& (field.getModifiers() & Modifier.FINAL) == 0

@Override
 protected void scrubClass(final Class<?> testCaseClass)
 throws IllegalAccessException {
     final Field[] fields = getClass().getDeclaredFields();
     for (Field field : fields) {
         final Class<?> fieldClass = field.getDeclaringClass();
         if (testCaseClass.isAssignableFrom(fieldClass) && !field.getType().isPrimitive()
                 && (field.getModifiers() & Modifier.FINAL) == 0) {
             try {
                 field.setAccessible(true);
                 field.set(this, null);
             } catch (Exception e) {
                 android.util.Log.d("TestCase", "Error: Could not nullify field!");
             }

             if (field.get(this) != null) {
                 android.util.Log.d("TestCase", "Error: Could not nullify field!");
             }
         }
     }
 }

关于JUnit 测试期间的 Android 2.3.x 静态字段问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9415117/

相关文章:

android - 使用 jQuery Mobile 的 Android 应用程序的启动屏幕

java - 如何使用 Java 反射调用 Android Dalvik 内部方法?

android - 无法找到检测目标包 : com. android.cts.stub

android - 在 Moto G 上运行 CTS

java - 完成加载监听器上的 WebView loadDataWithBaseURL

android - 处理已弃用的 fragment 事件 onAttach 和 onInflate 的正确方法是什么

java - 安卓谷歌分析 : set Mobile Device Info

java - Android中的双重检查锁定

java - 内部错误 : Bad sparse switch magic - what that means?

c# - 比较小数与其比例一致