我想使用 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;
}
}
这是我的 SharedPpreferencesProvider 类的结构
class SharedPreferenceProvider{
public String read(Context context, String key) {
SharedPreferences preference = context.getSharedPreferences("AppID", AppConstants.SAVE_MODE);
return preference.getString(key, EMPTY_STRING);
}
}
如何对这种具有如此多依赖关系的方法进行单元测试?
您在这里的问题是您正在测试的方法确实new Person()
.
基本上,这会影响您进行合理单元测试的能力。你可以通过使用PowerMock(ito)或JMockit来解决这个设计缺陷,或者通过避免这种调用来改进你的设计。换句话说:阅读有关依赖注入的信息。因为这将允许您已经有一些 Person 对象可用。然后你可以简单地提前模拟该对象,并让它的方法返回合理测试所需的任何内容。
待测试的代码只有一个依赖项,即 Person 对象。摆脱它(通过使你的代码与模拟的Person对象交互),你的问题就消失了。
通过单元测试,您可以尝试在隔离代码中查找错误。 然而,isPersonAvailable
方法纯粹由与其他类(如Context
和Person
)的交互组成。 如果此方法中存在错误,它们将位于与其他类的交互级别上:您是否调用了Person
的正确构造函数? 从person.loadPerson
返回值null
真的表示该人不可用,还是以不同的方式发出信号?
你永远不会发现这样的交互错误与模拟:如果你误解了其他类的工作方式,你将根据你自己的错误理解来实现模拟。 因此,像isPersonAvailable
这样的方法应该使用集成测试而不是单元测试来测试。
也就是说,即使它与这种特定方法没有太大关系,学习"依赖注入"的建议肯定是好的。 您可能还会发现寻找"控制反转"很有价值。