如何在创建活动之前模拟方法?

yit*_*al9 6 android unit-testing mocking mockito robolectric

我有一个活动

public class MyActivity extends ActionBarActivity {

    public int i;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        i = getSomeInt();
    }

    protected int getSomeInt() {
        return 1; // here can be an api-request
    }

}
Run Code Online (Sandbox Code Playgroud)

我想用robolectric 3.0和测试它mockito.

但我需要嘲笑getSomeInt()方法.

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class MyActivityTest {

    private MyActivity mActivity;

    @Before
    public void setUp() {

        mActivity = spy(Robolectric.buildActivity(MyActivity.class).create().get());
        doReturn(2).when(mActivity).getSomeInt(); //but it is already after onCreate!

    }

    @Test
    public void testGetInt() {
        assertEquals(2, mActivity.i); //error
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以通过创建活动来使用已经模拟的方法?

编辑

我试过了

@Before
public void setUp() {
    ActivityController<MyActivity> co = Robolectric.buildActivity(MyActivity.class);
    mActivity = spy(co.get());
    doReturn(2).when(mActivity).getSomeInt();
    co.create();
}
Run Code Online (Sandbox Code Playgroud)

但我似乎,这onCreate并没有被称为mActivity

assertEquals(2, mActivity.i); //给出结果:

java.lang.AssertionError: 
Expected :2
Actual   :0
Run Code Online (Sandbox Code Playgroud)

感谢Eugen的考虑,它不起作用,因为create调用控制器,操作时没有被监视的活动

Ale*_*scu 0

我认为这是不可能的。我尝试在测试中创建 Activity,监视它,然后使用该间谍创建一个控制器,但我无法让它工作,所以我无法想象你如何做到这一点。

话虽如此,这并不意味着您的根本问题没有解决方案,只是监视活动不是解决问题的方法。我建议您提出第二个问题,具体解释您想要实现的目标(例如在测试中模拟网络组件),您可能会得到一些替代解决方案来帮助您实现目标。