如何在Android Unit-Test中模拟Bundle方法?

我有一个处理片段创建的控制器类。 让我们说如下:

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对象的每个类中使用静态方法,而是使用它还是有更好的方法吗?

任何一个例子都是值得赞赏的。

一种方法是使用强大的模拟框架,如PowerMock ,它甚至可以拦截新对象的构造。

这应该适合你,但像Bundle这样的“简单”类意味着一些努力 – 你也可以使用UnMock插件来实现真正的实现。

使用Unmock插件来取消模拟Bundle类。 您需要使用Android 4.4( unmock 'org.robolectric:android-all:4.4_r1-robolectric-1' )取消模拟,因为Android的更高版本引用了非标准的Java方法。

您还需要保留ArrayMap和MapCollections。