如何进行内部方法调用检查
How to make an internal method call check
如何使用 Mockito 检查一个方法内部对另一个方法的调用 class?
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));
}
}
但是回答:
想要但未调用:
秒Class.sum_2(1, 2);
-> 在 FirstTest.first(FirstTest.java:14)
实际上,与此模拟的交互为零。
有几种可能性可以解决这个问题。正如我在评论中提到的,最常见的方法是在 FirstClass
中使用 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));
}
}
如果您无法创建构造函数,您可以添加一个 setter 并以这种方式注入您的实例。
Setter注入
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));
}
}
如果你真的,真的根本无法修改FirstClass
,你必须求助于反射。
有反射
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));
}
}
如何使用 Mockito 检查一个方法内部对另一个方法的调用 class?
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));
}
}
但是回答: 想要但未调用: 秒Class.sum_2(1, 2); -> 在 FirstTest.first(FirstTest.java:14) 实际上,与此模拟的交互为零。
有几种可能性可以解决这个问题。正如我在评论中提到的,最常见的方法是在 FirstClass
中使用 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));
}
}
如果您无法创建构造函数,您可以添加一个 setter 并以这种方式注入您的实例。
Setter注入
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));
}
}
如果你真的,真的根本无法修改FirstClass
,你必须求助于反射。
有反射
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));
}
}