【问题标题】:Unit test for method that calls other method of different class对调用不同类的其他方法的方法进行单元测试
【发布时间】:2019-02-18 11:55:04
【问题描述】:

我想使用 mockito 对一个方法进行单元测试,该方法调用不同类的其他其他方法,并且该其他方法包含一些共享首选项操作。

这是我要测试的方法

public boolean isPersonAvailable(Context context) {
    Person person = new Person();
    return person.loadPerson(context)!= null;
}

这是我的 Person 类的结构,该 Person 类依赖于另一个类的另一个方法

class Person{
    public  Person loadPerson(Context context) {
        SharedPreferenceProvider sp = new SharedPreferenceProvider();
        sp.read(context,"any key");
        return new User;
    }
}

这是我的 SharedPreferenceProvider 类的结构

class SharedPreferenceProvider{

       public  String read(Context context, String key) {
        SharedPreferences preference = context.getSharedPreferences("AppID", AppConstants.SAVE_MODE);
        return preference.getString(key, EMPTY_STRING);
    }

}

如何对这种有这么多依赖的方法进行单元测试?

【问题讨论】:

    标签: android unit-testing mockito sharedpreferences


    【解决方案1】:

    你的问题是你的测试方法是new Person()

    基本上,这会影响您进行合理单元测试的能力。您可以通过使用 PowerMock(ito) 或 JMockit 来解决该设计缺陷,或者通过避免该调用来改进您的设计。换句话说:阅读依赖注入。因为这将允许您已经有一些 Person 对象可用。然后您可以简单地提前模拟该对象,并让它的方法返回您需要进行合理测试的任何内容。

    您的被测代码对 Person 对象只有 一个 依赖项。摆脱它(通过使您的代码与模拟的 Person 对象交互),您的问题就消失了。

    【讨论】:

      【解决方案2】:

      通过单元测试,您可以尝试在孤立的代码中找到错误。然而,isPersonAvailable 方法纯粹由与其他类(如ContextPerson)的交互组成。如果这个方法有错误,它们将取决于与这些其他类的交互级别:你是否调用了Person的正确构造函数?来自person.loadPerson 的返回值null 真的表示此人不可用,还是以不同的方式发出信号?

      你永远不会发现这样的 mocks 交互 bug:如果你误解了其他类的工作方式,你会按照自己的错误理解来实现 mocks。因此,像isPersonAvailable 这样的方法应该使用集成测试而不是单元测试进行测试。

      也就是说,即使它与这个特定的方法没有多大关系,学习“依赖注入”的建议肯定是好的。您可能还会发现寻找“控制反转”很有价值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多