Powermock - 模拟静态类成员

时间:2016-09-28 12:53:24

标签: java unit-testing powermock easymock

我正在尝试模拟以下包含一些静态成员的类

public class ClientFact {

    private static final String BASE_URL = Config.getProperty("prop1");
    private static final String USERID = Config.getProperty("prop2");

    ......................

    public static Client createClient() throws AppException {

    }

}

但是我遇到了由Config.getProperty填充的静态成员变量的问题。这个类读取类似的属性文件

public class Config {

...............

    public static String getProperty(Param param) {
       String value = null;
       if (param != null) {
        value = properties.getProperty(param.toString());
       }
       return value;
    }
}

我正在尝试模拟此调用,因为我不关心我测试中的加载属性。这就是我试过的

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClientFact.class})

public class MyTests {


    @Test
    public void test() {

        PowerMock.mockStaticPartial(Config.class, "getProperty");
EasyMock.expect(Config.getProperty(EasyMock.anyObject())).andReturn(EasyMock.anyString()).anyTimes();

    PowerMock.mockStatic(ClientFact.class);

    }


}
  

但它给出了以下错误......

java.lang.NoSuchMethodError: org/easymock/internal/MocksControl.createMock(Ljava/lang/Class;[Ljava/lang/reflect/Method;)Ljava/lang/Object;
  at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2214)
  at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163)

我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:1)

非答案:考虑不在那里进行静态调用。

你看,它直接将一个类与其他类中的静态方法的实现相结合;没有真正的理由。 (并且为了记录:在您的ClientFact类中 USER_ID 字符串是静态字段似乎很奇怪。您真的打算所有ClientFact使用相同的USER_ID吗?! )

您可以使用非静态版本替换该静态调用(例如,通过引入接口);然后您可以使用依赖注入使该接口的实例可供您测试的类使用。然后你的所有测试工作没有需要Powermock。

长话短说:很多时候(但并不总是!)转向Powermock的需要源于生产代码,而这些代码并没有被编写为可测试的(就像你的情况一样)。因此,而不是使用大坏的Powermock锤子来修复"您的测试问题,您应该考虑改进您的生产代码。

您可能希望倾听那些videos以更好地了解我所说的内容。