在Java / Mockito中的最终类中模拟静态方法

时间:2014-12-17 10:11:41

标签: java mocking mockito powermock

如果我有课

public final class Application {
    public static String getName() { return "Bad App"; }
}

然后我如何更改行为并让getName返回,例如"Good App"? 我需要模拟它,以便测试中的类获得预期值。 实际上,静态方法会进行一些我想要避免的网络调用。

我无法重写应用程序的代码。

我使用的是Java 6,Maven,JUnit和Mockito。

有可能吗?

1 个答案:

答案 0 :(得分:4)

您可以使用powermockito进行以下操作:

假设这是使用静态方法的类:

public final class MyStaticClass {
    public static String helloWorld() {
        return "Hello World";
    }
}

你想要嘲笑helloWorld方法,让它返回" Hi World"而是在测试时。您可以执行以下操作:

@RunWith(PowerMockRunner.class)
@PrepareForTest({MyStaticClass.class})
public class PowerMockItoTest {
    @Test
    public void mockStaticClassTest() {
        PowerMockito.mockStatic(MyStaticClass.class);
        final String mockedResult = "Hi World";
        Mockito.when(MyStaticClass.helloWorld()).thenReturn(mockedResult);
        Assert.assertEquals(AStaticClass.helloWorld(), mockedResult);
    }
}

如果您想使用PowerMock,可以按照以下方式执行:

@RunWith(PowerMockRunner.class)
@PrepareForTest({MyStaticClass.class})
public class PowerMockTest {
    @Test
    public void testRegisterService() throws Exception {   
        PowerMock.mockStatic(MyStaticClass.class);
        final String mockedResult = "Hi World";
        expect(MyStaticClass.helloWorld()).andReturn(mockedResult);
        replay(MyStaticClass.class);
        Assert.assertEquals(AStaticClass.helloWorld(), mockedResult);
        verify(MyStaticClass.class);
    }
}