3

嘿,我正在使用 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() 时,会使用我的模拟实现进行初始化。

提前致谢!

4

1 回答 1

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 返回的实现

于 2012-07-10T21:47:33.560 回答