gpt4 book ai didi

android - 如何在创建 Activity 之前模拟方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:40 25 4
gpt4 key购买 nike

我有一个 Activity

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
}

}

我想用 robolectric 3.0mockito 测试它。

但我需要模拟 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
}
}

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

编辑

我试过了

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

但我似乎 onCreate 没有被 mActivity 调用

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

java.lang.AssertionError: 
Expected :2
Actual :0

感谢 Eugen 的考虑,它不起作用,因为 create 调用 Controller ,它与未被侦测的 Activity 一起运行

最佳答案

Mockito 只模拟一个对象。但是它不能修改ActivityController的 Activity 引用。

所以我尝试隔离函数并在创建之前将其传递给 Activity 。

四个步骤:

  1. 将函数隔离为新类的成员

    public class SomeInt{
    public int get() {
    return 1; // here can be an api-request
    }
    }
  2. 通过MyActivity中的对象使用函数

    public class MyActivity extends ActionBarActivity {

    SomeInt someInt;

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

    i = someInt.get();
    }
    }
    1. 制作一个API来设置测试中的对象someInt

      • 使用 ShadowActivity -- 我建议这样做,将代码和测试分开

        @Implements(MyActivity.class)
        public class ShadowMyActivity extends ShadowActivity
        {
        @RealObject
        private MyActivity myActivity;

        @Implementation
        public void setForMockito(SomeInt someint)
        {
        myActivity.someint = someint;
        }
        }
      • 或者公开对象

        public SomeInt someInt;

      • 或者为 MyActivity

        中的对象创建一个 public setter
    2. 模拟测试

      • 如果使用ShadowActivity

        @Config(constants = BuildConfig.class shadows = ShadowMyActivity.class)
        Class TestMyActivity {

        @Before
        public void setUp()
        {
        SomeInt someIntMock = mock(SomeInt.class);

        ActivityController<MyActivity> co = Robolectric.buildActivity(MyActivity.class);

        mActivity.setForMockito(someIntMock);

        doReturn(2).when(someIntMock).get();

        co.create();

        // verify here or in tearDown
        }

        ...
        }

关于android - 如何在创建 Activity 之前模拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31926689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com