From 9d46af3d7c488c24bb991a31ef866c899e9c06e6 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Wed, 18 Oct 2017 15:06:32 -0500 Subject: [PATCH] Introduce SpringTestContext This adds support for testing different configurations per method. --- .../config/test/SpringTestContext.java | 58 +++++++++++++++++++ .../security/config/test/SpringTestRule.java | 42 ++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 config/src/test/java/org/springframework/security/config/test/SpringTestContext.java create mode 100644 config/src/test/java/org/springframework/security/config/test/SpringTestRule.java diff --git a/config/src/test/java/org/springframework/security/config/test/SpringTestContext.java b/config/src/test/java/org/springframework/security/config/test/SpringTestContext.java new file mode 100644 index 0000000000..ec998a754c --- /dev/null +++ b/config/src/test/java/org/springframework/security/config/test/SpringTestContext.java @@ -0,0 +1,58 @@ +/* + * 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.security.config.test; + +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.mock.web.MockServletConfig; +import org.springframework.mock.web.MockServletContext; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +import java.io.Closeable; +import java.io.IOException; + +/** + * @author Rob Winch + * @since 5.0 + */ +public class SpringTestContext implements Closeable { + private Object test; + + private ConfigurableApplicationContext context; + + public void setTest(Object test) { + this.test = test; + } + + @Override + public void close() throws IOException { + this.context.close(); + } + + public SpringTestContext register(Class... classes) { + AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); + applicationContext.setServletContext(new MockServletContext()); + applicationContext.setServletConfig(new MockServletConfig()); + applicationContext.register(classes); + this.context = applicationContext; + return this; + } + + public void autowire() { + this.context.refresh(); + this.context.getBeanFactory().autowireBean(this.test); + } +} diff --git a/config/src/test/java/org/springframework/security/config/test/SpringTestRule.java b/config/src/test/java/org/springframework/security/config/test/SpringTestRule.java new file mode 100644 index 0000000000..36a9bde154 --- /dev/null +++ b/config/src/test/java/org/springframework/security/config/test/SpringTestRule.java @@ -0,0 +1,42 @@ +/* + * 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.security.config.test; + +import org.junit.rules.MethodRule; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.Statement; + +/** + * @author Rob Winch + * @since 5.0 + */ +public class SpringTestRule extends SpringTestContext implements MethodRule { + @Override + public Statement apply(Statement base, FrameworkMethod method, + Object target) { + return new Statement() { + public void evaluate() throws Throwable { + setTest(target); + try { + base.evaluate(); + } finally { + close(); + } + } + }; + } +}