我有一个处理片段创建的控制器类。让我们说如下:
public class FragmentController {
public static Fragment newInstance(String title, int total) {
return total > 0? MultipleDataFragment.newInstance(title, total)
: SingleDataFragment.newInstance(title);
}
}
public class MultipleDataFragment extends Fragment {
public static MultipleDataFragment newInstance( String title, int total) {
Bundle b = new Bundle();
b.putString("title", title);
b.putInt("total", total);
}
}
public class SingleDataFragment extends Fragment {
public static SingleDataFragment newInstance( String title, int total) {
Bundle b = new Bundle();
b.putString("title", title);
b.putInt("total", total);
}
}
在我的测试(标准Junit4测试类)中,我有:
@Test
public void testNewInstanceCreteMultipleData() throws Exception {
Fragment f = FragmentController.newInstance("Hello", 5);
assertTrue("MultipleDataFragment should be created"
, f instanceOf MultipleDataFragment);
}
因为我没有嘲笑Bundle,所以我得到了。
java.lang.RuntimeException: Method putString not mocked.Set
问题是如何模拟Bundle对象以便执行测试?我是否需要在创建Bundle对象的每个类中使用静态方法,而是使用它还是有更好的方法吗?
赞赏这个例子。
答案 0 :(得分:5)
一种方法是使用强大的模拟框架,如PowerMock,它甚至可以拦截新对象的构造。
这应该对你有用,但是像Bundle这样的“简单”类意味着一些努力 - 你也可以使用UnMock plugin来实现真正的实现。
答案 1 :(得分:0)
使用Unmock plugin取消模拟Bundle类。您需要使用Android 4.4(unmock 'org.robolectric:android-all:4.4_r1-robolectric-1'
)取消模拟,因为更高版本的Android会引用非标准Java方法。
您还需要保留ArrayMap和MapCollections。