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

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));
    }
}