使用MockContext时,在较新的Android版本中的ApplicationTestCase.createApplication()中的AssertionFailedError

Oma*_*ohl 10 android android-4.0-ice-cream-sandwich android-testing

我正在编写一个Android ApplicationTestCase(来自Diego T. Milano的Android应用程序测试指南中的TemperatureConverterApplicationTests示例,第171页).这个例子是针对Android 2.3编写的,它似乎不适用于Android 4.你不必知道这本书来理解这个问题,因为我简化了它.

这适用于Android 2.3.3(API 10):

setContext(new MockContext());
createApplication();
Run Code Online (Sandbox Code Playgroud)

[确切地说,抛出了UnsupportedOperationException,因为没有实现getPackageName().但这是正常的,可以通过使用实现getPackageName()和getSharedPreferences()的MockContext()子类来解决.这是不相关的,因为即使这样做之后问题仍然存在.]

问题是,使用Android 4.1.2(API 16)它不起作用.我得到一个AssertionFailedError,通过一些调试我发现是由于在ApplicationTestCase的第100行抛出了ClassCastException.

mApplication = (T) Instrumentation.newApplication(mApplicationClass, getContext());
Run Code Online (Sandbox Code Playgroud)

ClassCastException异常信息是:

java.lang.ClassCastException: android.test.mock.MockContext cannot be cast to android.app.ContextImpl
Run Code Online (Sandbox Code Playgroud)

任何建议为什么会发生这种情况以及如何避免?

编辑:相关问题:使用MockContext的Android ApplicationTestCase

Jas*_*sby 0

Instrumentation.newApplication()方法将返回一个Application对象。你正试图将它投射到任何东西上T。如果T不是超类或子类,Application您将得到一个ClassCastException. 在 Java 中,您只能将对象强制转换为该对象的超类或子类。如果不是,那么将抛出异常。

例如:

Object x = new Integer(0);
System.out.println((String)x);
Run Code Online (Sandbox Code Playgroud)

ClassCastException这将在第二行抛出 a ,因为您尝试将xInteger对象)转换为String. 因为 aStringInteger不是彼此的子类或超类。