与没有PowerMock的测试类不同的模拟方法调用

时间:2019-07-08 20:28:28

标签: java unit-testing mockito powermockito

为应用程序编写单元测试时遇到了麻烦。目前,我正在测试A类。在AI类测试的方法中,它调用帮助程序类的方法,该方法然后在同一帮助程序类(getKeyObject)中调用另一个方法,该方法的唯一功能是调用静态方法。我正在使用的框架中包含的类(buildKeyObject())。我正在尝试对getKeyObject()进行存根,以便它返回通常生成的Object的模拟,但是我不知道如何进行。

我认为的一种方法是利用PowerMockito并使用PowerMockito.mockStatic(ClassInFramework.class)方法在我正在使用的框架中创建类的模拟,然后再使用when(ClassInFramework.buildKeyObject()).thenReturn(KeyObjectMock),但是由于工作上的某些限制我在做,我被禁止使用PowerMockito。由于相同的原因,我也无法使用Mockito.spy或@spy批注。

class ATest{

    public A aInstance = new A(); 

    @Test
    public void test(){
        KeyObject keyObjectMock = Mockito.mock(KeyObject.class); 
        /*
        between these 2 lines is more mockito stuff related to the KeyObjectMock above. 
        */
        String content = aInstance.method1(); 
        Assert.assertEquals(content, "string")
    }
}
class A{
    public RandomClass d = new RandomClass()
    public String method1(){
        Helper helper = new Helper(); 
        Object a = helper.method2()
        return d.process(a); 
    }
}
class Helper{
    public Object method2(){
        KeyObject keyObject = getKeyObject(); 
        Object object = keyObject.getObject(); 
        return object; 
    }
    public KeyObject getKeyObject(){
        return ClassInFramework.buildKeyObject(); //static method call. 
    }
}

你们能帮我吗?

1 个答案:

答案 0 :(得分:1)

构造函数注入是执行此操作的常见方法之一。确实需要您修改被测类以简化测试。

首先,不要在方法中创建new Helper,而是使其成为成员变量并在构造函数中进行分配。

class A {

    private Helper helper;

    // constructor for test use
    public A(Helper helper) {
        this.helper = helper;
    }

    // convenience constructor for production use
    public A() {
        this(new Helper());
    }
}

现在,在您的测试中,您可以使用测试构造函数注入从Helper派生的任何模拟对象。可以使用Mockito甚至简单的继承来完成。

class MockHelper extends Helper {

    // mocked methods here
}

class ATest {

    public A aInstance = new A(new MockHelper());

    // ...
}