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);
}
}
}
谢谢!