如何模拟构造函数?

时间:2016-07-15 12:05:12

标签: java android unit-testing mocking

我的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'.

有没有办法模拟构造函数?我尝试了一个解决方案SO post(撰写本文时为18分,没有Poweermockito的解决方案),但我无法完成这项工作,因为我没有认为它是功能性的

3 个答案:

答案 0 :(得分:0)

使用Mockito你不能模拟constuctor,但你可以使用PowerMockito。

问题在于,您的间谍电话必须是实际的实例。你不能在调用模拟类中调用它。

MainActivity activityInstance = <get your activity instance>;

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您正在为MainActivity创建一个名为mainActivitySpy的间谍,但您正在调用when对象调用mainActivity,我认为该对象不是模拟也不是间谍。更改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();

    }
}