JUnit5手册中的主要 WebServerExtension 示例不完整,并且没有完全显示如何正确存储配置(例如enableSecurity,服务器url)。
该示例忽略或硬编码值。该手册(第5.11节,在扩展中保持状态)暗示应使用“存储”,但在构造对象时ExtensionContext尚不可用-它尚不清楚如何将这些数据作为ExtensionContext迁移到存储中尚未在构造函数中提供。
对我来说还不清楚,对于WebServerExtension编程示例使用Store API甚至是可取的,也许仅使用内部状态(例如this.serverUrl,this.enableSecurity等)就可以使用。
也许商店更适用于不使用这种“程序化”样式的扩展程序,在这种情况下(可能)存在自定义扩展程序的多个实例?换句话说,从指南中我不清楚这是否是受支持的范例?
其他在线的JUnit 5扩展示例(例如org.junit.jupiter.engine.extension.TempDirectory)展示了如何利用注释来处理将配置信息传递给Store的情况,但是如果有完整的程序化构建器类型示例,那就太好了像WebServerExtension一样。
像TempDirectory这样的示例显然可以通过beforeXXX()方法访问ExtensionContext,而WebServerExtension示例则没有。
使用下面的方法似乎可以正常工作,但是我想确认这是受支持的范例(即,在使用这种编程方法时使用字段而不是商店)。
public class WebServerExtension implements BeforeAllCallback {
private final boolean securityEnabled;
private final String serverUrl;
public WebServerExtension(Builder builder) {
this.securityEnabled = builder.enableSecurity;
this.serverUrl = build.serverUrl;
}
@Override
public void beforeAll(ExtensionContext context) {
// is it ok to use this.securityEnabled, this.serverUrl instead of Store API???
}
public String getServerUrl() {
return this.serverUrl;
}
public boolean isSecurityEnabled() {
return this.securityEnabled;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private boolean enableSecurity;
private String serverUrl;
public Builder enableSecurity(boolean b) {
this.enableSecurity = b;
return this;
}
public Builder serverUrl(String url) {
this.serverUrl = url;
return this;
}
public WebServerExtension build() {
return new WebServerExtension(this);
}
}
}
谢谢!