2012-02-23 17 views
3

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

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

+0

自分で答えを追加して受け入れるべきです。情報は本当に便利です、それはちょうど私に多くの時間を節約しました。 – Malcolm

答えて

1

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

さて、静的フィールドがコンストラクタ内で適切な値を取得できることを確認できます。うん、それは醜いハックですが、うまくいきます。 @Malcolmの要求

として

+0

ご返信ありがとうございます。はい、私はソースコードを持っているので私のテストプロジェクトでそれを行うことができます。しかし、Googleのリリースであるため、CTSテストパッケージには何もできません。 – Robin

関連する問題