Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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_Junit_Mockito - Fatal编程技术网

Java 如何进行内部方法调用检查

Java 如何进行内部方法调用检查,java,junit,mockito,Java,Junit,Mockito,如何使用Mockito检查一个方法内部对另一个类的另一个方法的调用 public class FirstClass { private SecondClass secondClass = new SecondClass(); public void sum() { secondClass.sum_2(1, 2); } } 我需要检查是否使用参数调用了第二个Class.sum_2()方法 我的测试: public class FirstTest {

如何使用Mockito检查一个方法内部对另一个类的另一个方法的调用

public class FirstClass {
    private SecondClass secondClass = new SecondClass();
    public void sum() {
        secondClass.sum_2(1, 2);
    }
}
我需要检查是否使用参数调用了第二个Class.sum_2()方法

我的测试:

public class FirstTest {

    FirstClass firstClass = new FirstClass();
    SecondClass secondClass = Mockito.spy(SecondClass.class);

    @Test
    public void first() {
        firstClass.sum();
        Mockito.verify(secondClass).sum_2(eq(1), eq(2));
    }
}
但答案是: 需要但未调用: 第二类。总和2(1,2); ->在FirstTest.first(FirstTest.java:14)
实际上,与此模拟没有任何交互。

解决此问题的方法有几种。正如我在评论中提到的,最常见的方法是使用
SecondClass
参数在
FirstClass
中创建一个构造函数,以便可以从外部注入实例

构造函数注入 如果不能创建构造函数,可以添加setter并以这种方式注入实例

设值注入 如果你真的,真的不能修改第一类,你必须使用反射

深思熟虑
如何解决这个问题有几种可能性。正如我在评论中提到的,最常见的方法是使用
SecondClass
参数在
FirstClass
中创建一个构造函数,以便可以从外部注入实例

构造函数注入 如果不能创建构造函数,可以添加setter并以这种方式注入实例

设值注入 如果你真的,真的不能修改第一类,你必须使用反射

深思熟虑
你写的方式,你不能。如果如图所示,
FirstClass
正在调用
SecondClass
中的方法,您可以创建一个静态方法(它似乎不依赖于内部的任何东西),并这样调用它:
StaticSecondClass.sum_2()
,或者,如果静态方法不可用,则可以在创建第一类对象时传递一个SecondClass对象。然后,测试这是微不足道的。Mockito的最新版本也支持mockStatic。要想得到更好的帮助,就要更加具体。您需要编写
FirstClass
,这样才能将
SecondClass
作为依赖项注入。最好通过构造函数。然后,您可以使用spy创建
FirstClass
的实例。现在,您创建的间谍与受测类中的
secondClass
实例没有连接。如果您无法在构造函数中正常传递它,您可以仅为接受
secondClass
参数的测试创建受保护的构造函数。不理想,但总比没有好。你写的方式,你不能。如果如图所示,
FirstClass
正在调用
SecondClass
中的方法,您可以创建一个静态方法(它似乎不依赖于内部的任何东西),并这样调用它:
StaticSecondClass.sum_2()
,或者,如果静态方法不可用,则可以在创建第一类对象时传递一个SecondClass对象。然后,测试这是微不足道的。Mockito的最新版本也支持mockStatic。要想得到更好的帮助,就要更加具体。您需要编写
FirstClass
,这样才能将
SecondClass
作为依赖项注入。最好通过构造函数。然后,您可以使用spy创建
FirstClass
的实例。现在,您创建的间谍与受测类中的
secondClass
实例没有连接。如果您无法在构造函数中正常传递它,您可以仅为接受
secondClass
参数的测试创建受保护的构造函数。不理想,但总比没有好。非常感谢您的帮助。带反射的选项适合我。祝你好运,并有一个美好的一天!非常感谢你的帮助。带反射的选项适合我。祝你好运,并有一个美好的一天!
public class FirstClass {
    private SecondClass secondClass;

    public FirstClass(SecondClass secondClass) {
        this.secondClass = secondClass;
    }

    public void sum() {
        secondClass.sum_2(1, 2);
    }
}

public class FirstTest {

    FirstClass firstClass;
    SecondClass secondClass;

    @Before
    public void setup() {
        secondClass = Mockito.spy(new SecondClass());
        firstClass = new FirstClass(secondClass);
    }

    @Test
    public void first() {
        firstClass.sum();
        Mockito.verify(secondClass).sum_2(eq(1), eq(2));
    }
}
public class FirstClass {
    private SecondClass secondClass;

    public void setSecondClass(SecondClass secondClass) {
        this.secondClass = secondClass;
    }

    public void sum() {
        secondClass.sum_2(1, 2);
    }
}

public class FirstTest {

    FirstClass firstClass;
    SecondClass secondClass;

    @Before
    public void setup() {
        secondClass = Mockito.spy(new SecondClass());
        firstClass = new FirstClass();
        firstClass.setSecondClass(secondClass);
    }

    @Test
    public void first() {
        firstClass.sum();
        Mockito.verify(secondClass).sum_2(eq(1), eq(2));
    }
}
public class FirstClass {
    private SecondClass secondClass;

    public void sum() {
        secondClass.sum_2(1, 2);
    }
}

public class FirstTest {

    FirstClass firstClass;
    SecondClass secondClass;

    @Before
    public void setup() throws NoSuchFieldException, IllegalAccessException {
        secondClass = Mockito.spy(new SecondClass());
        firstClass = new FirstClass();
        Field field = FirstClass.class.getDeclaredField("secondClass");
        field.setAccessible(true);
        field.set(firstClass, secondClass);
    }

    @Test
    public void first() {
        firstClass.sum();
        Mockito.verify(secondClass).sum_2(eq(1), eq(2));
    }
}