private String formatMethod() { return (method().getName() + Arrays.stream(this.method.getParameters()) .map(this::formatParameter) .collect(joining(",\n\t", "(\n\t", "\n)"))); }
/** * Resolve and return the {@code Method} equivalent to: * <p>{@code build().method()} */ public final Method resolveMethod() { return build().method(); }
/** * Resolve and return the {@code Method} equivalent to: * <p>{@code named(methodName).build().method()} */ public Method resolveMethod(String methodName) { return named(methodName).build().method(); }
@Test public void invocationTargetException() { Method method = ResolvableMethod.on(TestController.class).mockCall(TestController::exceptionMethod).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); try { mono.block(); fail("Expected IllegalStateException"); } catch (IllegalStateException ex) { assertThat(ex.getMessage(), is("boo")); } }
@Test public void cannotResolveArg() { Method method = ResolvableMethod.on(TestController.class).mockCall(o -> o.singleArg(null)).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); try { mono.block(); fail("Expected IllegalStateException"); } catch (IllegalStateException ex) { assertThat(ex.getMessage(), is("Could not resolve parameter [0] in " + method.toGenericString() + ": No suitable resolver")); } }
@Test public void illegalArgumentException() { this.resolvers.add(stubResolver(1)); Method method = ResolvableMethod.on(TestController.class).mockCall(o -> o.singleArg(null)).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); try { mono.block(); fail("Expected IllegalStateException"); } catch (IllegalStateException ex) { assertNotNull("Exception not wrapped", ex.getCause()); assertTrue(ex.getCause() instanceof IllegalArgumentException); assertTrue(ex.getMessage().contains("Controller [")); assertTrue(ex.getMessage().contains("Method [")); assertTrue(ex.getMessage().contains("with argument values:")); assertTrue(ex.getMessage().contains("[0] [type=java.lang.Integer] [value=1]")); } }
@Test public void resolveNoArgValue() { this.resolvers.add(stubResolver(Mono.empty())); Method method = ResolvableMethod.on(TestController.class).mockCall(o -> o.singleArg(null)).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); assertHandlerResultValue(mono, "success:null"); }
@Test public void exceptionInResolvingArg() { this.resolvers.add(stubResolver(Mono.error(new UnsupportedMediaTypeStatusException("boo")))); Method method = ResolvableMethod.on(TestController.class).mockCall(o -> o.singleArg(null)).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); try { mono.block(); fail("Expected UnsupportedMediaTypeStatusException"); } catch (UnsupportedMediaTypeStatusException ex) { assertThat(ex.getMessage(), is("415 UNSUPPORTED_MEDIA_TYPE \"boo\"")); } }
@Test public void voidMonoMethodWithExchangeArg() { this.resolvers.add(stubResolver(this.exchange)); Method method = ResolvableMethod.on(TestController.class).mockCall(c -> c.exchangeMonoVoid(exchange)).method(); HandlerResult result = invokeForResult(new TestController(), method); assertNull("Expected no result (i.e. fully handled)", result); assertEquals("body", this.exchange.getResponse().getBodyAsString().block(Duration.ZERO)); }
@Test public void resolveArg() { this.resolvers.add(stubResolver("value1")); Method method = ResolvableMethod.on(TestController.class).mockCall(o -> o.singleArg(null)).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); assertHandlerResultValue(mono, "success:value1"); }
@Test public void resolveProvidedArgFirst() { this.resolvers.add(stubResolver("value1")); Method method = ResolvableMethod.on(TestController.class).mockCall(o -> o.singleArg(null)).method(); Mono<HandlerResult> mono = invoke(new TestController(), method, "value2"); assertHandlerResultValue(mono, "success:value2"); }
@Test public void resolveNoArgs() { Method method = ResolvableMethod.on(TestController.class).mockCall(TestController::noArgs).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); assertHandlerResultValue(mono, "success"); }
@Test public void responseStatusAnnotation() { Method method = ResolvableMethod.on(TestController.class).mockCall(TestController::created).method(); Mono<HandlerResult> mono = invoke(new TestController(), method); assertHandlerResultValue(mono, "created"); assertThat(this.exchange.getResponse().getStatusCode(), is(HttpStatus.CREATED)); }
@Test public void voidMonoMethodWithResponseArg() { ServerHttpResponse response = this.exchange.getResponse(); this.resolvers.add(stubResolver(response)); Method method = ResolvableMethod.on(TestController.class).mockCall(c -> c.responseMonoVoid(response)).method(); HandlerResult result = invokeForResult(new TestController(), method); assertNull("Expected no result (i.e. fully handled)", result); assertEquals("body", this.exchange.getResponse().getBodyAsString().block(Duration.ZERO)); }
@Test public void resolveProvidedArg() { Method method = ResolvableMethod.on(TestController.class).mockCall(o -> o.singleArg(null)).method(); Mono<HandlerResult> mono = invoke(new TestController(), method, "value1"); assertHandlerResultValue(mono, "success:value1"); }
@Test public void checkNotModified() { MockServerHttpRequest request = MockServerHttpRequest.get("/").ifModifiedSince(10 * 1000 * 1000).build(); ServerWebExchange exchange = MockServerWebExchange.from(request); this.resolvers.add(stubResolver(exchange)); Method method = ResolvableMethod.on(TestController.class).mockCall(c -> c.notModified(exchange)).method(); HandlerResult result = invokeForResult(new TestController(), method); assertNull("Expected no result (i.e. fully handled)", result); }
@Test public void voidMethodWithExchangeArg() { this.resolvers.add(stubResolver(this.exchange)); Method method = ResolvableMethod.on(TestController.class).mockCall(c -> c.exchange(exchange)).method(); HandlerResult result = invokeForResult(new TestController(), method); assertNull("Expected no result (i.e. fully handled)", result); assertEquals("bar", this.exchange.getResponse().getHeaders().getFirst("foo")); }
@Test public void voidMethodWithResponseArg() { ServerHttpResponse response = this.exchange.getResponse(); this.resolvers.add(stubResolver(response)); Method method = ResolvableMethod.on(TestController.class).mockCall(c -> c.response(response)).method(); HandlerResult result = invokeForResult(new TestController(), method); assertNull("Expected no result (i.e. fully handled)", result); assertEquals("bar", this.exchange.getResponse().getHeaders().getFirst("foo")); }
@Before public void setup() { ArgumentResolverConfigurer resolvers = new ArgumentResolverConfigurer(); resolvers.addCustomResolver(new CustomArgumentResolver()); resolvers.addCustomResolver(new CustomSyncArgumentResolver()); ServerCodecConfigurer codecs = ServerCodecConfigurer.create(); codecs.customCodecs().decoder(new ByteArrayDecoder()); codecs.customCodecs().decoder(new ByteBufferDecoder()); AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.registerBean(TestControllerAdvice.class); applicationContext.refresh(); this.methodResolver = new ControllerMethodResolver( resolvers, ReactiveAdapterRegistry.getSharedInstance(), applicationContext, codecs.getReaders()); Method method = ResolvableMethod.on(TestController.class).mockCall(TestController::handle).method(); this.handlerMethod = new HandlerMethod(new TestController(), method); }