Большой! Кстати, наверное, я должен был упомянуть, почему он не работает с версией 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, который отображает поведение, которое я вижу.

Ответы на вопрос(1)

Ваш ответ на вопрос