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

在Java/Mockito中模拟最终类中的静态方法,java,mocking,mockito,powermock,Java,Mocking,Mockito,Powermock,如果我有课 public final class Application { public static String getName() { return "Bad App"; } } 那么,我如何改变行为并使getName返回,比如说,“好应用”? 我需要模拟它,以便测试中的类收到预期的值。 实际上,静态方法会进行一些我想要避免的网络调用 我不能重写应用程序的代码 我正在使用Java6、Maven、JUnit和Mockito 有可能吗?您可以使用powermockito进行如下操作

如果我有课

public final class Application {
    public static String getName() { return "Bad App"; }
}
那么,我如何改变行为并使
getName
返回,比如说,
“好应用”
? 我需要模拟它,以便测试中的类收到预期的值。 实际上,静态方法会进行一些我想要避免的网络调用

我不能重写应用程序的代码

我正在使用Java6、Maven、JUnit和Mockito


有可能吗?

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

@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);
    }
}
假设这是使用静态方法的类:

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);
    }
}

您是否必须使用静态调用,而不是使用可以模拟的正常依赖项?您将需要powermockito或powermock。@JonSkeet我无法更改
应用程序或其使用方式,或者至少在不久的将来不能更改。。如果可以,我绝对愿意。@almasshaikh有什么可以分享的片段吗?你更喜欢power mock还是power mockito?我想powermockito?啊,你看
MyStaticClass
必须是
final
。这两种方法都可以。无法使用powerMock和EasyMock模拟Inet4Address.getLocalHost()