10

Android ApplicationTestCase を作成しています ( Diego T. Milano によるAndroid アプリケーション テスト ガイドの 171 ページにある TemperatureConverterApplicationTests の例)。この例は Android 2.3 用に作成されたもので、Android 4 では機能しないようです。単純化したので、問題を理解するためにこの本を知っている必要はありません。

これはAndroid 2.3.3 (API 10)で正常に動作します。

setContext(new MockContext());
createApplication();

[正確には、getPackageName() が実装されていないため、UnsupportedOperationException がスローされます。しかし、これは正常なことであり、getPackageName() と getSharedPreferences() を実装する MockContext() のサブクラスを使用することで解決できます。これを行った後でも問題がまだ存在するため、これは関係ありません。]

問題は、Android 4.1.2 (API 16) では機能しないことです。ApplicationTestCase の 100 行目で ClassCastException がスローされたことが原因であることが、デバッグによって判明した AssertionFailedError を受け取りました。

mApplication = (T) Instrumentation.newApplication(mApplicationClass, getContext());

ClassCastExceptionメッセージは次のとおりです。

java.lang.ClassCastException: android.test.mock.MockContext cannot be cast to android.app.ContextImpl

なぜこれが起こるのか、どうすれば回避できるのか、何か提案はありますか?

編集: 関連する質問: MockContext を使用した Android ApplicationTestCase

4

2 に答える 2

1

私もこの動作を取得します。ContextWrapper を拡張することで回避しました。

public class RenamingMockContext extends RenamingDelegatingContext
{
    private static final String PREFIX = "test.";

    public RenamingMockContext(Context context)
    {
        super(new ContextWrapper(context), PREFIX);
    }

    @Override
    public String getPackageName()
    {
        return PREFIX + super.getPackageName();
    }
}
于 2013-10-31T15:19:30.600 に答える
0

Instrumentation.newApplication()メソッドはオブジェクトを返しますApplication。あなたはそれを何にでもキャストしようとしていTます。Tがあなたのスーパークラスでもサブクラスでもない場合ApplicationClassCastException. Java では、オブジェクトをそのオブジェクトのスーパー クラスまたはサブクラスにキャストすることしかできません。そうでない場合は、例外がスローされます。

例えば:

Object x = new Integer(0);
System.out.println((String)x);

(オブジェクトを) にClassCastExceptionキャストしようとしているため、これは 2 行目に a をスローします。とは、互いのサブ クラスまたはスーパー クラスではないためです。xIntegerStringStringInteger

于 2013-02-23T01:11:19.647 に答える