【问题标题】:Mock activity class member before onCreate在 onCreate 之前模拟活动类成员
【发布时间】:2017-04-21 17:12:52
【问题描述】:

我正在尝试使用 robolectric 3.3.2 测试活动。 想模拟和活动的成员初始化,因为直接调用导致NPE。

ActivityController<MyActivity> activityController = 
                Robolectric.buildActivity(MyActivity.class);
mTestActivity = activityController.get();

Mockito.when(mTestActivity.getCountry()).thenReturn("xxxx");
activityController.setup();

尝试了上面的代码,但是 setup.() (oncreate) 忽略了 mock getCountry 方法并从活动中调用定义。

有没有办法做到这一点?

【问题讨论】:

    标签: android unit-testing mockito robolectric


    【解决方案1】:

    即使你使用间谍(@SpyMockito.spy()),它也不会像这样工作。

    你应该使用存根:

    public class MyActivityTest{
    
        public static class StubMyActivity extends MyActivity {
           Country getCountry() {
               return someSpecialCountry;
           }
        }
    
        @Before
        public void setUp(){
            ActivityController<StubMyActivity> activityController = 
                    Robolectric.buildActivity(StubMyActivity.class);
            mTestActivity = activityController.setup().get();
        }    
    }
    

    【讨论】:

    • 谢谢欧根。我尝试了上述解决方案。但它无法找到字符串资源。 android.content.res.Resources$NotFoundException: String resource ID #0x7f0d0037 。当我不使用 Stubactivity 时,不会出现此异常。你发现这里有什么问题吗?
    • 您是否在日志消息中看到类似“manifest fly not found”的内容?
    • 清单已经到位。但我的代码引用了另一个包中的资源。我通过扩展 RobolectricTesRunner 并添加自定义路径来修复它。现在再次遇到另一个问题“R 包含最终字段,这些将由编译器内联并且无法重新映射”,这发生在新版本的 robolectric 中,如 3.2.1、3.3。等等。你知道吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2015-11-02
    • 2011-08-19
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多