当前位置: 首页 > 知识库问答 >
问题:

如何模拟类的属性调用?

萧英光
2023-03-14
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()的调用?

共有1个答案

漆雕育
2023-03-14

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

然后在测试中所需要做的就是模拟对mockOtherClass对象的调用。并使用它实例化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
}
 类似资料:
  • 问题内容: 我在Python中使用时遇到了一些困难: 测试实际上返回正确的值,但它是Mock对象,不是。您如何在Python库中模拟属性? 问题答案: 您需要使用和: 这意味着:调用时,在该调用的返回值上,为属性设置a以返回value 。

  • 问题内容: 我正在使用ref为组件编写测试。我想模拟ref元素并更改一些属性,但不知道如何做。有什么建议? 问题答案: 根据https://github.com/airbnb/enzyme/issues/1937中的讨论,这就是解决方案 可以使用非箭头函数对类进行猴子修补,其中“ this”关键字将传递到正确的作用域。

  • 问题内容: 我正在将我的某些类从对getter和setter的广泛使用改为对属性的更pythonic的使用。 但是现在我陷入了困境,因为以前的一些getter或setter方法会调用基类的相应方法,然后执行其他操作。但是如何通过属性来实现呢?如何在父类中调用属性getter或setter? 当然,仅调用属性本身即可进行无限递归。 问题答案: 您可能认为您可以调用由属性调用的基类函数: 尽管我认为这

  • 问题内容: 我在某些测试中使用Mockito。 我有以下课程: 我只想模拟的第二个调用。第一次调用必须调用real方法。有没有办法做到这一点? 问题答案: Mockito不支持此功能。 这可能不是你要寻找的答案,但是你看到的是不采用设计原则的症状: 偏重于继承而不是继承 如果你提取策略而不是扩展超类,那么问题就不存在了。 但是,如果不允许你更改代码,但无论如何都必须对其进行测试,并且以这种尴尬的方

  • 我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?

  • 基类 在派生类中不应用组合和其他函数。如果是,我是否应用了错误的模式?我应该如何处理相同的?