我正在尝试模拟以下包含一些静态成员的类
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)
我在这里做错了什么想法?
答案 0 :(得分:1)
非答案:考虑不在那里进行静态调用。
你看,它直接将一个类与其他类中的静态方法的实现相结合;没有真正的理由。 (并且为了记录:在您的ClientFact类中 USER_ID 字符串是静态字段似乎很奇怪。您真的打算所有ClientFact使用相同的USER_ID吗?! )
您可以使用非静态版本替换该静态调用(例如,通过引入接口);然后您可以使用依赖注入使该接口的实例可供您测试的类使用。然后你的所有测试工作没有需要Powermock。
长话短说:很多时候(但并不总是!)转向Powermock的需要源于生产代码,而这些代码并没有被编写为可测试的(就像你的情况一样)。因此,而不是使用大坏的Powermock锤子来修复"您的测试问题,您应该考虑改进您的生产代码。
您可能希望倾听那些videos以更好地了解我所说的内容。