10

我正在编写一个 Android ApplicationTestCase(TemperatureConverterApplicationTests 示例,可在Diego T. Milano 第 171 页的Android 应用程序测试指南中找到)。该示例是为 Android 2.3 编写的,它似乎不适用于 Android 4。您不必了解这本书就可以理解问题,因为我已经对其进行了简化。

这适用于Android 2.3.3 (API 10):

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

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

问题是Android 4.1.2 (API 16) 无法正常工作。我得到一个 AssertionFailedError,通过一些调试我发现这是由于在 ApplicationTestCase 的第 100 行抛出了 ClassCastException。

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

ClassCastException消息是:

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

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

编辑:相关问题:Android ApplicationTestCase using a MockContext

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不是超类或子类,Application您将获得ClassCastException. 在 Java 中,您只能将对象转换为该对象的超类或子类。如果不是,则将引发异常。

例如:

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

这将在第二行抛出 a ClassCastException,因为您试图将x(一个Integer对象)转换为 a String。因为 a StringandInteger不是彼此的子类或超类。

于 2013-02-23T01:11:19.647 回答