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

Rob*_*hai 4 java android unit-testing

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

public class FragmentController {

    public static Fragment newInstance(String title, int total) {
        return total > 0? MultipleDataFragment.newInstance(title, total)
            : SingleDataFragment.newInstance(title);
    }
}
Run Code Online (Sandbox Code Playgroud)
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);
    }
}
Run Code Online (Sandbox Code Playgroud)
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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试(标准Junit4测试类)中,我有:

@Test
public void testNewInstanceCreteMultipleData() throws Exception {
    Fragment f = FragmentController.newInstance("Hello", 5);

    assertTrue("MultipleDataFragment should be created"
        , f instanceOf MultipleDataFragment);
}
Run Code Online (Sandbox Code Playgroud)

因为我没有嘲笑Bundle,所以我得到了.

java.lang.RuntimeException: Method putString not mocked.Set
Run Code Online (Sandbox Code Playgroud)

问题是如何模拟Bundle对象以便执行测试?我是否需要在创建Bundle对象的每个类中使用静态方法,而是使用它还是有更好的方法吗?

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

小智 5

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

这应该适合你,但像Bundle这样的"简单"类意味着一些努力 - 你也可以通过使用UnMock插件来使用真正的实现.