Skip to content

Commit

Permalink
Support @RegisterExtension with @testinstance(PER_CLASS) lifecycle mode
Browse files Browse the repository at this point in the history
  • Loading branch information
sbrannen authored and Andrei94 committed Jun 23, 2018
1 parent fc38a94 commit b674f62
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext conte
ExtensionRegistry registry = populateNewExtensionRegistryFromExtendWith(this.testClass,
context.getExtensionRegistry());

// Register extensions from static fields here, at the class level but
// after extensions registered via @ExtendWith.
registerExtensionsFromFields(this.testClass, registry, null);
registerBeforeEachMethodAdapters(registry);
registerAfterEachMethodAdapters(registry);
Expand Down Expand Up @@ -180,6 +182,7 @@ private TestInstanceProvider testInstanceProvider(JupiterEngineExecutionContext

TestInstanceProvider testInstanceProvider = childRegistry -> instantiateAndPostProcessTestInstance(
parentExecutionContext, extensionContext, childRegistry.orElse(registry));

return childRegistry -> extensionContext.getTestInstance().orElseGet(
() -> testInstanceProvider.getTestInstance(childRegistry));
}
Expand All @@ -189,6 +192,10 @@ private Object instantiateAndPostProcessTestInstance(JupiterEngineExecutionConte

Object instance = instantiateTestClass(context, registry, extensionContext);
invokeTestInstancePostProcessors(instance, registry, extensionContext);
// In addition, we register extensions from instance fields here since the
// best time to do that is immediately following test class instantiation
// and post processing.
registerExtensionsFromFields(this.testClass, registry, instance);
return instance;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,6 @@ public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext conte
ExtensionRegistry registry = populateNewExtensionRegistry(context);
Object testInstance = context.getTestInstanceProvider().getTestInstance(Optional.of(registry));

registerExtensionsFromFields(getTestClass(), registry, testInstance);

ThrowableCollector throwableCollector = new ThrowableCollector();
ExtensionContext extensionContext = new MethodExtensionContext(context.getExtensionContext(),
context.getExecutionListener(), this, context.getConfigurationParameters(), testInstance,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolver;
Expand All @@ -40,6 +42,11 @@ void instanceLevel() {
assertOneTestSucceeded(InstanceLevelExtensionRegistrationTestCase.class);
}

@Test
void instanceLevelWithTestInstancePerClassLifecycle() {
assertOneTestSucceeded(InstanceLevelExtensionRegistrationWithTestInstancePerClassLifecycleTestCase.class);
}

@Test
void classLevel() {
assertOneTestSucceeded(ClassLevelExtensionRegistrationTestCase.class);
Expand Down Expand Up @@ -95,6 +102,39 @@ void afterEach(String wisdom) {

}

@TestInstance(PER_CLASS)
static class InstanceLevelExtensionRegistrationWithTestInstancePerClassLifecycleTestCase {

@RegisterExtension
final CrystalBall crystalBall = new CrystalBall("Outlook good");

@BeforeAll
void beforeAll(String wisdom) {
assertWisdom(crystalBall, wisdom, "@BeforeAll");
}

@BeforeEach
void beforeEach(String wisdom) {
assertWisdom(crystalBall, wisdom, "@BeforeEach");
}

@Test
void test(String wisdom) {
assertWisdom(crystalBall, wisdom, "@Test");
}

@AfterEach
void afterEach(String wisdom) {
assertWisdom(crystalBall, wisdom, "@AfterEach");
}

@AfterAll
void afterAll(String wisdom) {
assertWisdom(crystalBall, wisdom, "@AfterAll");
}

}

static class ClassLevelExtensionRegistrationTestCase {

@RegisterExtension
Expand Down

0 comments on commit b674f62

Please sign in to comment.