【问题标题】:java.lang.ClassCastException: android.app.Application cannot be cast to com.google.android.apps.common.inject.InjectedApplicationjava.lang.ClassCastException:android.app.Application 无法转换为 com.google.android.apps.common.inject.InjectedApplication
【发布时间】:2015-12-03 13:32:07
【问题描述】:

我正在尝试不使用 Robolectric

@RunWith(RobolectricTestRunner.class)
@Config(
        manifest = "...mypath.../AndroidManifest.xml",
        qualifiers = "fr-normal-port-hdpi",
        sdk = 21,
        application = Application.class)
public class SetPaymentActivityTest {


    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void sendWrongPaymentDetails() throws Exception {

        SetPaymentActivity activity = Robolectric.buildActivity(SetPaymentActivity.class)
//                .attach()
                .create()
//                .starst()
//                .resume()
//                .visible()
                .get();
         activity = Robolectric.setupActivity(SetPaymentActivity.class);

//        Shadows.shadowOf(SetPaymentActivity.class);

        String url = activity.getUrl();
        assertThat(url, equalTo(""));
    }
}

产品代码:

public class SetPaymentActivity extends FragmentActivity implements DaggerActivity {

但我收到此错误:

Time: 109.712
There was 1 failure:
1) sendWrongPaymentDetails(com.google.android.apps.ridematch.payments.SetPaymentActivityTest)
java.lang.ClassCastException: android.app.Application cannot be cast to com.google.android.apps.common.inject.InjectedApplication
    at com.google.android.apps.common.inject.ActivityInjectHelper.initGraph(ActivityInjectHelper.java:56)

我做错了什么?

【问题讨论】:

    标签: java android unit-testing robolectric


    【解决方案1】:

    也许你需要你的SetPaymentActivityTest来扩展InjectedApplication

    像这样:

    public class SetPaymentActivityTest extends InjectedApplication {
    

    【讨论】:

    • 为什么,我从来没有在任何例子中看到过
    • 这只是一个假设。或者可能需要扩展 SetPaymentActivity。试试看是否有帮助。
    【解决方案2】:

    很容易修复。

    将您的测试代码更改为下一个:

    @RunWith(RobolectricGradleTestRunner.class)
    @Config(
            constants = BuildConfig.class,
            qualifiers = "fr-normal-port-hdpi",
            sdk = 21)
    

    问题是 Robolectric 尝试使用您在配置中指定的 Application 并且在某些时候您将其投射到您的班级

    【讨论】:

      【解决方案3】:

      我创建了一个虚拟的 TestApplication 类:

      public TestApplication extends InjectedApplication

      并配置:

      @Config(
              manifest = "...mypath.../AndroidManifest.xml",
              qualifiers = "fr-normal-port-hdpi",
              sdk = 21,
              application = TestApplication.class)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-02
        • 2016-06-30
        • 2016-01-14
        • 2013-07-25
        • 2016-07-05
        • 2017-01-24
        • 2018-08-03
        相关资源
        最近更新 更多