Browse Source
This commit adds a common base class for server-less setup with the option to configure a transformation function on the ServerWebExchange for every request. The transformation is applied through a WebFilter. As a result the RouterFunction setup is now invoked behind a DispatcherHandler with a HandlerMapping + HandlerAdapter. Issue: SPR-15250pull/1354/head
Rossen Stoyanchev
8 years ago
9 changed files with 307 additions and 78 deletions
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
/* |
||||
* Copyright 2002-2017 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.test.web.reactive.server; |
||||
|
||||
import java.util.function.Function; |
||||
|
||||
import org.springframework.web.server.ServerWebExchange; |
||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder; |
||||
|
||||
/** |
||||
* Base class for implementations of {@link WebTestClient.MockServerSpec}. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 5.0 |
||||
*/ |
||||
abstract class AbstractMockServerSpec<B extends WebTestClient.MockServerSpec<B>> |
||||
implements WebTestClient.MockServerSpec<B> { |
||||
|
||||
private Function<ServerWebExchange, ServerWebExchange> exchangeMutator; |
||||
|
||||
|
||||
@Override |
||||
public <T extends B> T exchangeMutator(Function<ServerWebExchange, ServerWebExchange> mutator) { |
||||
this.exchangeMutator = this.exchangeMutator != null ? this.exchangeMutator.andThen(mutator) : mutator; |
||||
return self(); |
||||
} |
||||
|
||||
@SuppressWarnings("unchecked") |
||||
protected <T extends B> T self() { |
||||
return (T) this; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public WebTestClient.Builder configureClient() { |
||||
|
||||
WebHttpHandlerBuilder handlerBuilder = createHttpHandlerBuilder(); |
||||
|
||||
if (this.exchangeMutator != null) { |
||||
handlerBuilder.prependFilter((exchange, chain) -> { |
||||
exchange = this.exchangeMutator.apply(exchange); |
||||
return chain.filter(exchange); |
||||
}); |
||||
} |
||||
|
||||
return new DefaultWebTestClientBuilder(handlerBuilder.build()); |
||||
} |
||||
|
||||
protected abstract WebHttpHandlerBuilder createHttpHandlerBuilder(); |
||||
|
||||
@Override |
||||
public WebTestClient build() { |
||||
return configureClient().build(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
/* |
||||
* Copyright 2002-2017 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.test.web.reactive.server; |
||||
|
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.util.Assert; |
||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder; |
||||
|
||||
/** |
||||
* Spec for setting up server-less testing by detecting components in an |
||||
* {@link ApplicationContext}. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 5.0 |
||||
*/ |
||||
class ApplicationContextSpec extends AbstractMockServerSpec<ApplicationContextSpec> { |
||||
|
||||
private final ApplicationContext applicationContext; |
||||
|
||||
|
||||
ApplicationContextSpec(ApplicationContext applicationContext) { |
||||
Assert.notNull(applicationContext, "ApplicationContext is required"); |
||||
this.applicationContext = applicationContext; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected WebHttpHandlerBuilder createHttpHandlerBuilder() { |
||||
return WebHttpHandlerBuilder.applicationContext(this.applicationContext); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
/* |
||||
* Copyright 2002-2017 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.test.web.reactive.server; |
||||
|
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||
import org.springframework.web.reactive.DispatcherHandler; |
||||
import org.springframework.web.reactive.HandlerAdapter; |
||||
import org.springframework.web.reactive.HandlerMapping; |
||||
import org.springframework.web.reactive.HandlerResultHandler; |
||||
import org.springframework.web.reactive.function.server.RouterFunction; |
||||
import org.springframework.web.reactive.function.server.RouterFunctions; |
||||
import org.springframework.web.reactive.function.server.support.HandlerFunctionAdapter; |
||||
import org.springframework.web.reactive.function.server.support.ServerResponseResultHandler; |
||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder; |
||||
|
||||
/** |
||||
* Spec for setting up server-less testing against a RouterFunction. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 5.0 |
||||
*/ |
||||
public class RouterFunctionSpec extends AbstractMockServerSpec<RouterFunctionSpec> { |
||||
|
||||
private final RouterFunction<?> routerFunction; |
||||
|
||||
|
||||
RouterFunctionSpec(RouterFunction<?> routerFunction) { |
||||
this.routerFunction = routerFunction; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected WebHttpHandlerBuilder createHttpHandlerBuilder() { |
||||
return WebHttpHandlerBuilder.applicationContext(initApplicationContext()); |
||||
} |
||||
|
||||
@SuppressWarnings("Convert2MethodRef") |
||||
private ApplicationContext initApplicationContext() { |
||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); |
||||
context.registerBean("webHandler", DispatcherHandler.class, () -> new DispatcherHandler()); |
||||
context.registerBean(HandlerMapping.class, () -> RouterFunctions.toHandlerMapping(this.routerFunction)); |
||||
context.registerBean(HandlerAdapter.class, () -> new HandlerFunctionAdapter()); |
||||
context.registerBean(HandlerResultHandler.class, () -> new ServerResponseResultHandler()); |
||||
context.refresh(); |
||||
return context; |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue