【问题标题】:how to mock a constructor?如何模拟构造函数?
【发布时间】:2016-07-15 12:05:11
【问题描述】:

我的MainActivity 中有一个方法,我想模​​拟A 实例:

public void some_method() {
    A a = new A(); 
    ....   
}

所以我尝试在MainActivity 类中创建一个方法

public A createA(){return new A()}

然后some_method 变成

public void some_method() {
        A a = createA(); 
        ....   
    }

我试过了

    MainActivity mainActivitySpy = (MainActivity)Mockito.spy(MainActivity.class);
    when(mainActivity.createA()).thenReturn(null)

但我收到此错误消息

org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.

有没有办法模拟构造函数?我尝试了SOpost 的解决方案(撰写本文时为 18 分,没有Poweermockito 的解决方案)但我无法完成这项工作,因为我认为它不起作用

【问题讨论】:

    标签: java android unit-testing mocking


    【解决方案1】:

    使用 Mockito 不能模拟构造函数,但使用 PowerMockito 可以。

    这里的问题是,您的间谍调用必须在实际实例中。你不能把它叫做模拟类。

    MainActivity activityInstance = <get your activity instance>;
    
    MainActivity mainActivitySpy = Mockito.spy(activityInstance);
        when(mainActivity.createA()).thenReturn(null);
    

    【讨论】:

    • 我知道,但我没能让PowerMockitoAndroid 一起工作
    【解决方案2】:

    我会将模拟的 A 对象作为参数传递给 some_method()。你也可以为 A 对象创建一个特殊的工厂,然后你可以模拟工厂

    【讨论】:

      【解决方案3】:

      您正在为MainActivity 创建一个名为mainActivitySpy 的间谍,但您在一个对象调用mainActivity 上调用when,我认为它既不是模拟也不是间谍。更改 when 调用会产生预期的效果:

      import static org.mockito.Mockito.*;
      
      public class MainActivity {
      
          public A createA(){
              return new A();
          }
      
          public void some_method() {
              A a = createA(); 
              System.out.println("Mock:" + a);
          }
      
          public static void main(String[] args) {
      
              MainActivity mainActivitySpy = (MainActivity)spy(MainActivity.class);
              when(mainActivitySpy.createA()).thenReturn(null);
      
              mainActivitySpy.some_method();
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 2013-09-03
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多