@Override public void beforeEach(final ExtensionContext context) { Store store = context.getStore(NAMESPACE); List<TestLifecycleAware> lifecycleAwareContainers = collectParentTestInstances(context) .parallelStream() .flatMap(this::findRestartContainers) .peek(adapter -> store.getOrComputeIfAbsent(adapter.getKey(), k -> adapter.start())) .filter(this::isTestLifecycleAware) .map(lifecycleAwareAdapter -> (TestLifecycleAware) lifecycleAwareAdapter.container) .collect(Collectors.toList()); store.put(LOCAL_LIFECYCLE_AWARE_CONTAINERS, lifecycleAwareContainers); signalBeforeTestToContainers(lifecycleAwareContainers, testDescriptionFrom(context)); } // ... private Stream<StoreAdapter> findRestartContainers(Object testInstance) { return ReflectionUtils .findFields(testInstance.getClass(), isRestartContainer(), ReflectionUtils.HierarchyTraversalMode.TOP_DOWN) .stream() .map(f -> getContainerInstance(testInstance, f)); } private Predicate<Field> isRestartContainer() { return isContainer().and(ReflectionUtils::isNotStatic); } private static Predicate<Field> isContainer() { return field -> { boolean isAnnotatedWithContainer = AnnotationSupport.isAnnotated(field, Container.class); if (isAnnotatedWithContainer) { boolean isStartable = Startable.class.isAssignableFrom(field.getType()); if (!isStartable) { throw new ExtensionConfigurationException( String.format("FieldName: %s does not implement Startable", field.getName()) ); } return true; } return false; }; }