我在第171页写了一个
Android ApplicationTestCase(TemperatureConverterApplicationTests示例,由Diego T. Milano的Android应用程序测试指南中找到).该示例是针对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)它不起作用.我得到一个AssertionFailedError通过一些调试我发现是由于ClassCastException被抛出在第100行的ApplicationTestCase.
mApplication = (T) Instrumentation.newApplication(mApplicationClass,getContext());
ClassCastException消息是:
java.lang.ClassCastException: android.test.mock.MockContext cannot be cast to android.app.ContextImpl
任何建议为什么会发生这种情况以及如何避免?
解决方法
我也得到这个行为.我通过扩展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(); } }