#junit5 #junit5-extension-model
#junit5 #junit5-extension-model
Вопрос:
Основной пример WebServerExtension из руководства JUnit5 является неполным, и он не полностью показывает, как правильно хранить конфигурацию (например, enableSecurity, URL сервера).
Пример игнорирует или жестко кодирует значения. Руководство (раздел 5.11. Сохранение состояния в расширениях) подразумевает, что следует использовать «Хранилище», но ExtensionContext еще недоступен при создании объекта — неясно, как обрабатывать перенос этих данных в хранилище, поскольку ExtensionContext еще недоступен в конструкторе.
Также мне не ясно, что использование Store API для программного примера WebServerExtension даже желательно, и, возможно, он мог бы работать, просто используя внутреннее состояние (например, this.ServerURL , this.enableSecurity и т.д.).
Может быть, хранилище более применимо к расширениям, которые не используют этот «программный» стиль, где может существовать несколько экземпляров пользовательского расширения (соответствующим образом)? Другими словами, из руководства мне не ясно, поддерживается ли это парадигма или нет?
Другие примеры расширения JUnit 5 в Интернете (например, org.junit.jupiter.engine.extension.TempDirectory) покажите, как использовать аннотации для обработки передачи информации о конфигурации в хранилище, но было бы неплохо, если бы был полный пример типа programmatic builder, такой как WebServerExtension.
Такие примеры, как TempDirectory, явно имеют доступ к ExtensionContext из методов beforeXXX(), тогда как пример 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);
}
}
}
Спасибо!
Комментарии:
1. Если вы используете
@RegisterExtension
для программной регистрации расширения, вы несете ответственность за создание экземпляра расширения. Поэтому в таких случаях обычно должно быть нормально сохранять состояние в экземпляре расширения. Вам просто нужно убедиться, что одно и то же расширение никогда не регистрировалось через@ExtendWith
.2. Если вы считаете, что руководство пользователя может быть улучшено в этом отношении, не стесняйтесь открывать проблему в JUnit 5 GitHub issue tracker.