模拟方法调用不同的类,而不是没有 PowerMock 的测试类



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

我想的一种方法是利用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. 
    }
}

你们能帮我吗?

构造函数注入是执行此操作的常用方法之一。它确实要求您修改要测试的类以便于测试。

首先,不要在方法中创建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());
    // ...
}

相关内容

  • 没有找到相关文章

最新更新