Testing / JUnit6 Interview Questions
What is the @RegisterExtension annotation and how does it differ from @ExtendWith?
@ExtendWith registers an extension via a class reference (declarative, at compile time). @RegisterExtension registers an extension via a field instance at runtime, allowing the extension to be configured with constructor parameters.
// @ExtendWith: declarative, no configuration @ExtendWith(MockitoExtension.class) class SimpleTest { ... } // @RegisterExtension: programmatic, configurable class ConfigurableTest { // Static field: extension scope covers ALL tests (like @BeforeAll) @RegisterExtension static WireMockExtension server = WireMockExtension.newInstance() .options(WireMockConfiguration.options().port(8089)) .build(); // Instance field: extension scope covers EACH test (like @BeforeEach) @RegisterExtension TempDirectory tempDir = new TempDirectory(); @Test void callsExternalApi() { server.stubFor(get("/orders") .willReturn(aResponse().withStatus(200))); // test code } @Test void writesToTempFile() throws IOException { Path file = tempDir.getRoot().resolve("output.txt"); Files.writeString(file, "hello"); assertEquals("hello", Files.readString(file)); } } // Key rule: static @RegisterExtension field // -> extension callbacks run around the class (BeforeAll/AfterAll) // Instance @RegisterExtension field // -> callbacks run around each test (BeforeEach/AfterEach)
More Related questions...