在较新的Android版本使用MockContext时,ApplicationTestCase.createApplic



我正在写一个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。因为StringInteger不是彼此的子类或超类

相关内容

  • 没有找到相关文章

最新更新