Java 如何进行内部方法调用检查
如何使用Mockito检查一个方法内部对另一个类的另一个方法的调用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 {
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));
}
}