3

Android2.3.xでCTSR12テストを実行しているときに問題が見つかりました。メディアストレステスト中に、ファイルの例外が原因ですべてのケースが失敗しました。これは、静的変数「FILE_PATH」がテストケース中にnullであることが原因です。Android2.3.6を搭載したNexusOne/NexusSで100%再現可能であることがわかりました。

また、それをテストするための非常に単純なテストプロジェクトを作成します。コードは、以下に添付されています。

アクティビティコード:

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にマージするのに非常に重要であることがわかりました。CTS R12を通過するために、2.3.7でこれを修正するにはどうすればよいですか?

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

私は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!");
             }
         }
     }
 }

コードのこのセクションをテストケースクラスに入れて、スーパークラスのメソッドをオーバーライドしました。この問題は修正されました。

4

2 に答える 2

1

@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!");
             }
         }
     }
 }
于 2013-03-21T02:40:17.380 に答える
0

静的フィールドがコンストラクター内で適切な値を取得することを確認できます。うん、それは醜いハックですが、それは動作します。

于 2012-02-23T14:51:27.283 に答える