Большой! Кстати, наверное, я должен был упомянуть, почему он не работает с версией 1.0.1 провайдера. Поэтому я обновлю свой ответ, чтобы включить эту информацию сейчас.
я проблемы с JUnit 5 (5.0 или 5.1) и пользовательским расширением.
Мы используем загрузчик сервисов для загрузки всех реализаций, которые затем изменяют загрузку нашего расширения. Эти реализации могут быть загружены только один раз, поэтому я подумал об использованииExtensionContext.Store
и разместив его там. Каждый последующий тестовый экземпляр просто загружает его изStore
вместо через сервисный загрузчик.
Теперь я даже осознаю иерархическую структуру контекста и знаю, что есть некоторый «корневой» контекст, через который вы можете пройтиExtensionContext.getRoot()
, Но этот «корневой» контекст (экземплярJupiterEngineExtensionContext
) на самом деле не root - есть другойкаждый тестовый экземпляр.
Скажи у тебя естьFooTest
а такжеBarTest
затем распечататьgetRoot()
для каждого из них получается:
org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext@1f9e9475
org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext@6c3708b3
И, следовательно, пытается извлечь ранее сохраненную информацию изStore
выходит из строя.
ClassExtensionContext
а такжеJupiterEngineExtensionContext
довольно размыто.Есть ли другой способ глобально хранить некоторую информацию через расширение?Вот (очень) упрощенная версия того, как я пытался работать с магазином (вырезая всю остальную информацию в основном). Я также добавил некоторыеSystem.out.print()
призывает подчеркнуть то, что я вижу. Выполнение этого расширения на двухтестовые занятия результаты в том, что я описал выше:
public class MyExtension implements BeforeAllCallback {
@Override
public void beforeAll(ExtensionContext context) throws Exception {
System.out.println(context.getRoot());
if (context.getRoot().getStore(Namespace.create(MyExtension.class)).get("someIdentifier", String.class) == null) {
context.getRoot().getStore(Namespace.create(MyExtension.class)).put("someIdentifier", "SomeFooString");
} else {
// this is never executed
System.out.println("Found it, no need to store anything again!");
}
}
}
РЕДАКТИРОВАТЬ: Вот минимальный проект на GH (ссылка), под управлениемmvn clean install
, который отображает поведение, которое я вижу.