Проблема статического поля в Android 2.3.x во время теста JUnit - PullRequest
3 голосов
/ 23 февраля 2012

Я обнаружил проблему при выполнении теста CTS R12 для Android 2.3.x.Во время стресс-теста в СМИ все случаи не были выполнены из-за исключения файла.Это вызвано тем, что статическая переменная "FILE_PATH" является нулевой во время теста.Я обнаружил, что он воспроизводится на 100% на NexusOne / NexusS с Android 2.3.6.

Я также пишу очень простой тестовый проект для тестирования, код прилагается ниже.

Код активности:

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 часов.Итак, у меня есть ответ здесь:

Мой французский коллега дал мне подсказку, чтобы найти окончательное решение: я обнаружил некоторые изменения в исходном коде ICS ActivityTestCase.java

Изменение добавленоусловие: && (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!");
             }
         }
     }
 }

Я поместил этот раздел кода в свой класс тестового примера, чтобы переопределить метод суперкласса, проблема устранена.

Ответы [ 2 ]

1 голос
/ 21 марта 2013

По просьбе @Malcolm

Я не могу ответить на свой вопрос сам в течение 8 часов.Итак, у меня есть ответ здесь:

Мой французский коллега дал мне подсказку, чтобы найти окончательное решение: я обнаружил некоторые изменения в исходном коде ICS ActivityTestCase.java

Изменение добавленоусловие: && (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!");
             }
         }
     }
 }
0 голосов
/ 23 февраля 2012

Хорошо, вы можете убедиться, что ваши статические поля получают соответствующее значение внутри конструктора. Да, это безобразный хак, но это работает.

...