作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 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.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
}
}
是否可以通过创建 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 。
四个步骤:
将函数隔离为新类的成员
public class SomeInt{
public int get() {
return 1; // here can be an api-request
}
}
通过MyActivity
中的对象使用函数
public class MyActivity extends ActionBarActivity {
SomeInt someInt;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
i = someInt.get();
}
}
制作一个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
模拟测试
如果使用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/
我是一名优秀的程序员,十分优秀!