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

Bot*_*ten 5 java mocking mockito powermock

如果我有课

public final class Application {
    public static String getName() { return "Bad App"; }
}
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能改变行为并做出getName回报,比如说"Good App"?我需要模拟它,以便被测试的类收到预期的值。实际上,静态方法会进行一些我想避免的网络调用。

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

我正在使用 Java 6、Maven、JUnit 和 Mockito。

是否可以?

SMA*_*SMA 6

您可以使用 powermockito 来完成此操作,如下所示:

假设这是您的带有静态方法的类:

public final class MyStaticClass {
    public static String helloWorld() {
        return "Hello World";
    }
}
Run Code Online (Sandbox Code Playgroud)

并且您想模拟 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)