有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Powermock模拟静态类成员

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

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 {

    }

}

但我遇到了由配置填充的静态成员变量的问题。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);

    }


}

but its giving the following error...

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) 个答案

  1. # 1 楼答案

    一个非回答:考虑不要在那里做<强>静态< /强>调用。

    你看,这直接将一个类与另一个类中静态方法的实现相耦合;没有真正的理由。(请注意:用户ID字符串是ClientFact类中的静态字段,这似乎很奇怪。您真的打算让所有ClientFacts都使用相同的用户ID吗?!)

    您可以用非静态版本替换该静态调用(例如,通过引入接口);然后,您可以使用依赖项注入使该接口的一个实例可供您测试的类使用。然后,您的所有测试都可以运行,而不需要使用Powermock

    长话短说:经常(但不总是!)转向Powermock的需要源于生产代码,而生产代码并不是为了可测试而编写的(就像您的案例一样)。因此,不要使用大坏的PalfMeC锤锤子来“修复”测试问题,而应该考虑改进生产代码。

    你可能想听听这些videos来更好地理解我在说什么