首页 > 解决方案 > 如何模拟被测类实例的实例方法的输出?

问题描述

我正在测试一个类的实例方法,但它也依赖于对另一个实例方法的调用。如何模拟第二个实例方法的响应?

不是实际的代码,而是等效的:

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 的返回

标签: javaunit-testingmocking

解决方案


正如@GhostCat 提到的,使用 Mockito Spies 将是一个很好的解决方案。

理想情况下,您不必模拟实例方法来测试类中的另一个实例方法。如果您必须模拟该实例方法,则它可能与其他实例方法不属于同一类(请查看其他SO 帖子)。如果是这种情况,您可以将该实例方法拉出到它自己的类中,然后依赖该类的实例(给构造函数) - 然后您可以在创建类时使用该实例方法模拟类测试。

或者也许与其隔离 m1 并对 m1 运行单元测试,不如只对测试整个类的行为的类运行测试,而不是仅仅测试单个实例方法的行为。

或者,如果两个实例方法确实属于同一个类,那么对方法进行单独的单元测试绝对至关重要,并且您没有使用模拟框架。您可以创建一个类 A 的子类,它覆盖 m2 并返回 m2 通常返回的模拟结果。然后就可以测试这个子类并成功单元测试m1。

编辑:如果 m2 或多或少是一个不需要自己测试的辅助方法,我会将它设为私有方法,然后根本不测试它,除非通过类的公共方法间接进行测试。


推荐阅读