@Rank(Integer.MAX_VALUE) @Singleton @Override public Client provide() { if (!httpServer.isStarted()) { throw new TestException("test server not started"); } Object testInstance = testContext.getTestInstance(); Class<? extends Object> testClass = testInstance.getClass(); Optional<ClientConfig> optional = of(testClass.getDeclaredMethods()) .filter(p -> p.getDeclaredAnnotation(Config.class) != null) .filter(p -> p.getParameterCount() == 0) .filter(p -> p.getReturnType().isAssignableFrom(ClientConfig.class)) .findFirst() .map(p -> reflectionUtil.invokeMethod(testInstance, p)) .map(ClientConfig.class::cast); ClientConfig clientConfig = optional.orElseGet(ClientConfig::new); JerseyTest jerseyTest = testContext.getTestInstance().getClass().getAnnotation(JerseyTest.class); if (jerseyTest.logTraffic() && !clientConfig.isRegistered(LoggingFilter.class)) { clientConfig.register(new LoggingFilter(log, jerseyTest.dumpEntity())); } return ClientBuilder.newClient(clientConfig); }
@RuntimeType public Object intercept(@AllArguments Object[] args, @Origin Method method, @This Object proxy) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { HK2TestContext testContext = context.getTestContext().get(); SystemInjecteeImpl injectee = context.getInjectee(); Object instance; ServiceLocatorImpl locator = testContext.getLocator(); ActiveDescriptor<?> descriptor = locator.getInjecteeDescriptor(injectee); // if we don't find a descriptor it could be that the injectee is an // assisted injection and can be resolved using it's injection resolver. if (descriptor == null) { instance = LOCATOR_UTIL.getInjectionResolver(locator, injectee).resolve(injectee, null); } else { instance = locator.getService(descriptor, null, injectee); } // if any instance argument is a proxied service then unpack it by // getting the the acutal service and set it as the argument. for (int i = 0; i < args.length; i++) { Object arg = args[i]; if (arg instanceof ProxyService) { args[i] = ((ProxyService) arg)._getService(); } } return method.invoke(instance, args); }