如何使用PowerMockito从最终的静态类返回模拟对象

时间:2012-07-10 07:27:42

标签: java testng mockito powermock

嘿我正在使用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()来返回我在Test中创建的Object2的模拟,我知道我可以使用PowerMock模拟FinalClass,但是我还没有得到如何在classToTest中注入它我创建了,所以当我从我的测试对象2运行classToTest.methodToTest()时,我的模拟实现被初始化。

提前致谢!

1 个答案:

答案 0 :(得分:4)

您希望使用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返回的实现