Android 2.3.xのCTS R12テストを行っているときに問題が見つかりました。 メディアストレステスト中、ファイル例外のためにすべてのケースが失敗しました。 テストケース中に静的変数 "FILE_PATH"がnullであることが原因です。 Android 2.3.6搭載のNexusOne/NexusSで100%再現可能であることがわかりました。JUnitテスト中のAndroid 2.3.x静的フィールドの問題
私もそれをテストするための非常に簡単なテストプロジェクトは、以下の添付のコードを記述します。
アクティビティコード:
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);
}
}
テストケースコード:
2月24日1時24分:あなたはそれを実行すると
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);
}
}
、あなたは結果がわかります。 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!");
}
}
}
}
私はスーパークラスのメソッドをオーバーライドするために私のテストケースクラスにコードのこのセクションを入れて、問題が修正されました。
自分で答えを追加して受け入れるべきです。情報は本当に便利です、それはちょうど私に多くの時間を節約しました。 – Malcolm