JUnit5 マニュアルのメインのWebServerExtensionの例は不完全であり、構成 (enableSecurity、サーバー URL など) を適切に保存する方法を完全には示していません。
この例では、値を無視またはハードコードしています。マニュアル (セクション 5.11. 拡張機能での状態の維持) は、「ストア」を使用する必要があることを暗示していますが、オブジェクトの構築時に ExtensionContext はまだ利用できません。このデータをストアに移行する方法が明確ではありません。コンストラクターではまだ使用できません。
また、WebServerExtension のプログラム例で Store API を使用することがさらに望ましく、内部状態 (たとえば、this.serverUrl、this.enableSecurity など) を使用するだけで機能する可能性があることも明らかではありません。
ストアは、カスタム拡張機能の複数のインスタンスが (適切に) 存在する可能性があるこの「プログラムによる」スタイルを使用しない拡張機能により適しているのでしょうか? 言い換えれば、これがサポートされているパラダイムであるかどうかは、ガイドから明確ではありませんか?
オンラインの他の JUnit 5 拡張機能の例 (例: org.junit.jupiter.engine.extension.TempDirectory) は、アノテーションを活用してストアに構成情報を渡す方法を示していますが、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);
}
}
}
ありがとう!