【问题标题】:How to mock Bundle method in Android Unit-Test?如何在 Android 单元测试中模拟 Bundle 方法?
【发布时间】:2015-02-22 16:52:08
【问题描述】:

我有一个控制器类来处理片段创建。让我们像下面这样说:

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 对象并使用它来代替静态方法,还是有更好的方法?

对此的任何示例表示赞赏。

【问题讨论】:

  • 请注意,您的 getInstance() 方法不完整。他们甚至没有返回语句。

标签: java android unit-testing


【解决方案1】:

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

这应该对你有用,但是模拟像 Bundle 这样的“简单”类需要付出一些努力——你也可以通过使用UnMock plugin 来使用真正的实现。

【讨论】:

  • 有关 Bundle 类的模拟示例,您可能需要查看 my answer for very similar question。关于 UnMock,我在 Bundle 中使用它时遇到了麻烦,因为在运行简化的测试用例时,我得到了 NoSuchFieldError for mMap
  • 从 API 21 开始,Bundle 扩展了 BaseBundle,这就是它找不到 mMap 的原因。不幸的是,取消模拟 BaseBundle 并没有帮助,因为 ArrayMap 现在使用 JVM 不包含的非标准版本的 System.arraycopy()。所以 unmocking Bundle 是行不通的。
  • @ErikBrowne 你的解决方案是什么?
【解决方案2】:

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

您还需要保留 ArrayMap 和 MapCollections。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2021-04-02
    相关资源
    最近更新 更多