如何模拟调用 class 的属性?

How to mock call on an attribute of class?

我正在尝试测试以下内容 class

public class MyClass {
    protected OtherClass other;
    public MyClass(String arg) {
        this.other = new OtherClass(arg);
    }

    public void doSomething() {
        String response = other.sendRequest(); // mock this call
        // ...
    }
}

我想测试 doSomething(),为此我需要模拟调用 sendRequest()。为此,我尝试了以下方法,但没有用:

@Test
public void doSomethingTest() {
    MyClass myClass = new MyClass("test");
    when(myClass.other.sendRequest()).thenReturn("response");
    myClass.doSomething();
}

真正的 sendRequest() 仍在被调用,而不是返回模拟响应。

如何使用 Mockito 模拟对 sendRequest() 的调用?

如果你在MyClassclass中实例化OtherClass对象,那么真的不可能模拟它 您需要在 MyClass 之外实例化它,然后将其注入 MyClass(例如通过其构造函数)。

然后您在测试中需要做的就是模拟对模拟 OtherClass 对象的调用。并用它来实例化MyClass对象

将 MyClasss 更改为

public class MyClass {

    protected OtherClass other;
    
    public MyClass(OtherClass otherClass) {
        this.other = otherClass;
    }

    public void doSomething() {
        String response = other.sendRequest(); 
    }

}

您的代码将从

        MyClass myClass = new MyClass("s");

        OtherClass other = new OtherClass("s");
        MyClass myClass = new MyClass(other);

你现在可以编写这个测试了:

@Test
public void doSomethingTest() {
    OtherClass other = mock(OtherClass.class);
    when(other.sendRequest()).thenReturn("response");
    
    MyClass myClass = new MyClass(other);
    myClass.doSomething();

   // .. test assertions
}