【问题标题】:How do I use PowerMockito to return a mock object from a final static class如何使用 PowerMockito 从最终静态类返回模拟对象
【发布时间】:2012-07-10 07:27:42
【问题描述】:

嘿,我正在使用 Mockito 和 TestNG 为一个对服务进行大量外部调用的类编写单元测试,我实际上对此很陌生,因此我似乎被网络上的文档所困对于我的确切问题。

我的测试基本上是这样的

@Test
public class ClassToTestTest{

@Mock
private Object1 object1;

@Mock
private Object2 object2;

@InjectMocks
private ClassToTest classToTest;

public void test1(){
    classToTest.methodToTest();

}
...
...
}

实际类如下

import FinalClass;

public class ClassToTest{

private Object1 object1;
private Object2 object2;

public void methodToTest(){
    object2 = FinalClass.getObject2();

    ...
    ...
}

...
...
}

我只需要 FinalClass.getObject2() 来返回我在测试中创建的 Object2 的模拟,我知道我可以使用 PowerMock 模拟 FinalClass,但我不太了解如何将它注入到 classToTest 中我已经创建了,因此当我从测试 object2 运行 classToTest.methodToTest() 时,会使用我的模拟实现进行初始化。

提前致谢!

【问题讨论】:

    标签: java testng mockito powermock


    【解决方案1】:

    当您希望使用 PowerMockito 模拟最终静态类时,您缺少注释 @PrepareForTest 和 mockStatic() 的使用。我认为您可能会感到困惑的地方是您正在处理 final static 类而不仅仅是 final 类,因此您需要注意一些额外的模拟调用。

    鉴于这些实现类

    /*
    The final static class that's giving you all the mocking grief
    */
    public final class FinalStaticClass {
    
        // this object instance "will not" be returned when we mock() the class
        private static MyObject obj = new MyObject();
    
        public static MyObject getMyObject() {
            return obj; 
        }
    }
    
    /*
    A simple value object used by MyClass
    */
    public class MyObject {
    
    }
    
    /*
    The class you wish to test
    */
    public class MyClass {
    
        private MyObject obj;
    
        public void methodToTest() {
            obj = FinalStaticClass.getMyObject();
            // do something
        }
    
        public MyObject getMyObject() {
            return obj;
        }
    }
    

    确保在你的项目中包含powermock-mockito-1.4.10-full.jar,然后你就可以使用这个测试类了

    import static org.junit.Assert.assertEquals;
    import static org.powermock.api.mockito.PowerMockito.mockStatic;
    import static org.powermock.api.mockito.PowerMockito.when;
    
    import ...    
    
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(FinalStaticClass.class)
    public class MyClassTest{
    
        @Mock
        MyObject expectedObject;
    
        @InjectMocks
        MyClass myClass = new MyClass();
    
        @Test
        public void test1(){
    
            // mock all static methods
            mockStatic(FinalStaticClass.class);
    
            when(FinalStaticClass.getMyObject()).thenReturn(expectedObject);
    
            // execute the method under test
            myClass.methodToTest();
    
            assertEquals(expectedObject, myClass.getMyObject());
    
        }
    }
    

    您可以看到 expectedObject 是您在测试中创建的模拟,而不是从 FinalStaticClass 返回的实现

    【讨论】:

    • 嘿,我试过我已经放了@PrepareForTest 注释,它只是给我一个错误说,不能继承最终类,是的,在TestNG 中你可以在类级别使用注释。它将所有公共无效程序转换为测试。
    • 使用工作代码示例更新了答案,以解决您班级的static final 性质
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多