如何使用 Powermock 模拟 class 及其内部静态 class
How to mock a class and its inner static class using Powermock
我有一个 class 作为 :
public class SomeClass {
private String someField;
public SomeClass(String field) {
someField = field;
}
public String getUrl() {
return "http://" + someField;
}
public static class Builder {
private String uri;
public Builder(String url) {
this.uri = url;
}
public SomeClass build() {
return new SomeClass(uri);
}
}
}
上面的 class 被另一个 class 调用为:
class MainClass {
private SomeClass someClass;
public boolean isUrlAvailable() {
someClass = new SomeClass.Builder("myURI").build();
String url = someClass.getUrl();
if (url != null && url.length() > 10) {
return true;
}
return false;
}
}
我的要求是测试 MainClass,为此我需要模拟 SomeClass 和 SomeClass.Builder class。我尝试模拟了两个 classes 但未能成功达到要求。
您显示的代码应该不要求您模拟任何东西。它只使用那个构建器来构建一些东西。假设您已经单独测试了 SomeClass/Builder - 您只需验证 Main 中的方法给出了正确的结果。
无论如何:模拟静态 class 是可能的 - 参见 here。唯一要注意的是:把所有的前置条件都弄好,比如要有需要的注解:
RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassBuilderClass.class)
除此之外:您首先不要嘲笑任何东西 static。您的 唯一 问题是对 new 的调用!
并且 - real 答案在这里:只需 pass 在 SomeClass 的那个实例中工作(而不是调用 new Builder
在被测方法内部)!
我有一个 class 作为 :
public class SomeClass {
private String someField;
public SomeClass(String field) {
someField = field;
}
public String getUrl() {
return "http://" + someField;
}
public static class Builder {
private String uri;
public Builder(String url) {
this.uri = url;
}
public SomeClass build() {
return new SomeClass(uri);
}
}
}
上面的 class 被另一个 class 调用为:
class MainClass {
private SomeClass someClass;
public boolean isUrlAvailable() {
someClass = new SomeClass.Builder("myURI").build();
String url = someClass.getUrl();
if (url != null && url.length() > 10) {
return true;
}
return false;
}
}
我的要求是测试 MainClass,为此我需要模拟 SomeClass 和 SomeClass.Builder class。我尝试模拟了两个 classes 但未能成功达到要求。
您显示的代码应该不要求您模拟任何东西。它只使用那个构建器来构建一些东西。假设您已经单独测试了 SomeClass/Builder - 您只需验证 Main 中的方法给出了正确的结果。
无论如何:模拟静态 class 是可能的 - 参见 here。唯一要注意的是:把所有的前置条件都弄好,比如要有需要的注解:
RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassBuilderClass.class)
除此之外:您首先不要嘲笑任何东西 static。您的 唯一 问题是对 new 的调用!
并且 - real 答案在这里:只需 pass 在 SomeClass 的那个实例中工作(而不是调用 new Builder
在被测方法内部)!