如何为被测类的实例模拟实例方法的输出?

时间:2018-06-30 19:54:57

标签: java unit-testing mocking

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

或者也许不孤立m1并针对m1运行单元测试,而是只对测试整个类的行为的类运行测试,而不只是单实例方法的行为。

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

编辑:如果m2或多或少是一个不需要单独进行测试的辅助方法,那么我将其设为私有方法,然后完全不进行测试,除非进行间接测试通过该类的公共方法。