Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为被测类的实例模拟实例方法的输出?_Java_Unit Testing_Mocking - Fatal编程技术网

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

Java 如何为被测类的实例模拟实例方法的输出?,java,unit-testing,mocking,Java,Unit Testing,Mocking,我正在测试一个类的实例方法,但它也依赖于对另一个实例方法的调用。如何模拟来自第二个实例方法的响应 不是实际代码,而是等效代码: public class A{ public String[][][] m1(String[][][] arg1){ ArrayList<String[]> arg2 = new ArrayList<>(); String[][][] response = m2(arg1, arg2);

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

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

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[][][]{{{}}};
    }
}
公共A类{
公共字符串[][]m1(字符串[][]arg1){
ArrayList arg2=新的ArrayList();
字符串[]响应=m2(arg1,arg2);
如果(响应==null)
返回arg1;
其他的
返回响应;
}
公共字符串[][]m2(字符串[][]arg1,数组列表arg2){
返回新字符串[][[]{{{}};
}
}

所以在这里,我将测试方法的m1返回值,但要模拟方法m2的返回,正如@GhostCat所提到的,使用Mockito Spies将是一个很好的解决方案

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

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

或者,如果两个实例的方法真的属于同一个类,并且绝对重要的是,您要分开对这些方法进行单元测试,并且不要使用模拟框架。您可以创建类a的子类,该类重写m2并返回m2通常返回的模拟结果。然后您可以测试这个子类并成功地对m1进行单元测试


编辑:如果m2或多或少是一个辅助方法,实际上不需要单独测试,我会将其设置为私有方法,然后完全不测试它,除非通过类的公共方法间接测试

你可以用一个莫基托间谍。研究“部分嘲弄”了解更多细节。谢谢,间谍似乎是我需要的。为了继续,我将分别模拟该方法,因为实际上我使用的主方法将其参数传递给内部方法,然后内部方法返回一个修改过的对象,但我将模拟传递给该方法,该方法只返回测试所需的数据,如果该内部方法的响应与我传递给它的响应相同,这就是我嘲笑它的原因。这并不是为了覆盖或测试目的而将测试分开,而是一种变通方法,这并不理想,但只要我将TDD应用于这两种方法,我认为这是可以接受的。还有更好的方法吗?我对这一部分的意思有点困惑:“我向方法传递了一个mock,如果这个内部方法的响应与我传递给它的相同,它只返回测试所需的数据”。这个内部方法可能只是一个私有方法吗?在这种情况下,我甚至不会单独测试它,因为它本质上只是一个助手方法?是的,它实际上是一个私有助手方法。我模拟了另一个elements实例方法(未包含在示例中),该方法仅在传递与主方法(m1)完全相同的参数时返回预期的测试数据。但是我仍然应该测试第二个方法(m2),看看它是否返回了预期的值。通常不测试私有方法,因为它们不包含(在大多数情况下)大部分应用程序逻辑,它们只是从更重要的公共方法中提取代码片段的辅助方法。此外,公共方法是那些实际暴露于外部世界的方法,因此通过测试这些方法,您可以确保私有方法也能工作。我认为您可能不应该测试m2,因为测试m1应该已经涵盖了它。是的,但是我应该为我作为参数传递给m1的模拟创建一个更复杂的匹配器。另外,这个helper方法封装了实例方法逻辑的重要部分,主方法变得相当大,所以我决定最好将部分代码分开,我可以使用反射来测试私有方法,尽管这有点太多了。但是,是的,我想如果helper方法足够复杂,我应该模拟它的响应。