Testing / JUnit6 Interview Questions
What is the ParameterResolver extension interface and how do you use it for custom injection?
The ParameterResolver extension interface allows you to inject custom objects into test method parameters, @BeforeEach methods, and constructors. This is the foundation of how MockitoExtension injects @Mock objects and how SpringExtension injects beans.
// Custom ParameterResolver: inject a configured HttpClient public class HttpClientExtension implements ParameterResolver, BeforeEachCallback, AfterEachCallback { private final Map<ExtensionContext, HttpClient> clients = new ConcurrentHashMap<>(); @Override public boolean supportsParameter( ParameterContext paramCtx, ExtensionContext extCtx) { // Only resolve HttpClient parameters return paramCtx.getParameter().getType() == HttpClient.class; } @Override public Object resolveParameter( ParameterContext paramCtx, ExtensionContext extCtx) { // Create and return an HttpClient for this test HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(5)) .build(); clients.put(extCtx, client); return client; } @Override public void afterEach(ExtensionContext ctx) { HttpClient client = clients.remove(ctx); if (client != null) client.close(); } } // Usage: @ExtendWith(HttpClientExtension.class) class ApiIntegrationTest { @Test void fetchUsers(HttpClient client) { // injected by extension! HttpResponse<String> resp = client.send( HttpRequest.newBuilder(URI.create("https://api.example.com/users")).build(), HttpResponse.BodyHandlers.ofString() ); assertEquals(200, resp.statusCode()); } }
More Related questions...