我正在写一个Android ApplicationTestCase(在Android应用程序测试指南中找到的温度转换器应用程序测试示例Diego T. Milano在171页)。这个例子是为Android 2.3编写的,它似乎不适用于Android 4。你不需要读这本书就能理解我已经简化了的问题。
Android 2.3.3 (API 10):setContext(new MockContext());
createApplication();
[确切地说,因为没有实现getPackageName()而抛出UnsupportedOperationException。但这是正常的,可以通过使用MockContext()的子类来实现getPackageName()和getSharedPreferences()来解决。这是不相关的,因为即使这样做了,问题仍然存在
问题是,与Android 4.1.2 (API 16)它不工作。我得到一个AssertionFailedError,通过一些调试,我发现是由于ClassCastException在ApplicationTestCase的第100行被抛出。
mApplication = (T) Instrumentation.newApplication(mApplicationClass, getContext());
ClassCastException消息是:
java.lang.ClassCastException: android.test.mock.MockContext cannot be cast to android.app.ContextImpl
有什么建议为什么会发生这种情况以及如何避免它吗?
编辑:相关问题:Android ApplicationTestCase使用MockContext
我也有这种行为。我通过扩展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();
}
}
Instrumentation.newApplication()
方法将返回一个Application
对象。你试图将它转换为T
是什么。如果T
不是Application
的超类或子类,您将得到ClassCastException
。在Java中,您只能将对象强制转换为该对象的超类或子类。如果不是,则抛出异常。
:
Object x = new Integer(0);
System.out.println((String)x);
这将在第二行抛出ClassCastException
,因为您试图将x
(一个Integer
对象)转换为String
。因为String
和Integer
不是彼此的子类或超类