java - 如何模拟被测类实例的实例方法的输出?
问题描述
我正在测试一个类的实例方法,但它也依赖于对另一个实例方法的调用。如何模拟第二个实例方法的响应?
不是实际的代码,而是等效的:
public class A{
public String[][][] m1(String[][][] arg1){
ArrayList<String[]> arg2 = new ArrayList<>();
String[][][] response = m2(arg1, arg2);
if (response == null)
return arg1;
else
return response;
}
public String[][][] m2(String[][][] arg1, ArrayList<String[]> arg2){
return new String[][][]{{{}}};
}
}
所以在这里我将测试方法的 m1 返回值,但想模拟方法 m2 的返回
解决方案
正如@GhostCat 提到的,使用 Mockito Spies 将是一个很好的解决方案。
理想情况下,您不必模拟实例方法来测试类中的另一个实例方法。如果您必须模拟该实例方法,则它可能与其他实例方法不属于同一类(请查看其他SO 帖子)。如果是这种情况,您可以将该实例方法拉出到它自己的类中,然后依赖该类的实例(给构造函数) - 然后您可以在创建类时使用该实例方法模拟类测试。
或者也许与其隔离 m1 并对 m1 运行单元测试,不如只对测试整个类的行为的类运行测试,而不是仅仅测试单个实例方法的行为。
或者,如果两个实例方法确实属于同一个类,那么对方法进行单独的单元测试绝对至关重要,并且您没有使用模拟框架。您可以创建一个类 A 的子类,它覆盖 m2 并返回 m2 通常返回的模拟结果。然后就可以测试这个子类并成功单元测试m1。
编辑:如果 m2 或多或少是一个不需要自己测试的辅助方法,我会将它设为私有方法,然后根本不测试它,除非通过类的公共方法间接进行测试。
推荐阅读
- c# - LINQ - 分层数据中的列总和
- javascript - 使用工厂函数的聚合绑定中的多个控件
- android - 在 webview 获取请求标头
- javascript - ws:// over https:// - 混合内容
- angular - Angular:在投影内容中获取 NgForm
- flutter - Flutter - 自定义警报对话框未显示
- label - ChartJs Bar 的标签隐藏
- reactjs - 如何干燥一些需要特征标记的方法
- dns - 如何进行快速的 DNS 传播?
- scala - 我想使用scala根据spark中的行数将一个大数据帧拆分为多个数据帧。我无法弄清楚