diff --git a/buildSrc/src/main/groovy/io/spring/gradle/convention/DependencySetPlugin.groovy b/buildSrc/src/main/groovy/io/spring/gradle/convention/DependencySetPlugin.groovy
index b4670771e0..1cc4048406 100644
--- a/buildSrc/src/main/groovy/io/spring/gradle/convention/DependencySetPlugin.groovy
+++ b/buildSrc/src/main/groovy/io/spring/gradle/convention/DependencySetPlugin.groovy
@@ -27,7 +27,6 @@ import org.gradle.api.plugins.JavaPlugin
*
sockDependencies
* seleniumDependencies
* gebDependencies
- * powerMockDependencies
* slf4jDependencies
* jstlDependencies
* apachedsDependencies
@@ -61,28 +60,6 @@ public class DependencySetPlugin implements Plugin {
"org.codehaus.groovy:groovy-all"
]
- project.ext.powerMockDependencies = [
- "org.powermock:powermock-core",
- "org.powermock:powermock-api-support",
- "org.powermock:powermock-module-junit4-common",
- "org.powermock:powermock-module-junit4",
- project.dependencies.create("org.powermock:powermock-api-mockito") {
- exclude group: 'org.mockito', module: 'mockito-all'
- },
- "org.powermock:powermock-reflect"
- ]
-
- project.ext.powerMock2Dependencies = [
- "org.powermock:powermock-core",
- "org.powermock:powermock-api-support",
- "org.powermock:powermock-module-junit4-common",
- "org.powermock:powermock-module-junit4",
- project.dependencies.create("org.powermock:powermock-api-mockito2") {
- exclude group: 'org.mockito', module: 'mockito-all'
- },
- "org.powermock:powermock-reflect"
- ]
-
project.ext.slf4jDependencies = [
"org.slf4j:slf4j-api",
"org.slf4j:jcl-over-slf4j",
diff --git a/buildSrc/src/test/resources/samples/dependencyset/build.gradle b/buildSrc/src/test/resources/samples/dependencyset/build.gradle
index c4327c7e8c..2ea87e437e 100644
--- a/buildSrc/src/test/resources/samples/dependencyset/build.gradle
+++ b/buildSrc/src/test/resources/samples/dependencyset/build.gradle
@@ -12,10 +12,9 @@ repositories {
dependencies {
testCompile spockDependencies
testCompile gebDependencies
- testCompile powerMockDependencies
testCompile seleniumDependencies
testCompile slf4jDependencies
testCompile springCoreDependency
testCompile jstlDependencies
testCompile apachedsDependencies
-}
\ No newline at end of file
+}
diff --git a/buildSrc/src/test/resources/samples/dependencyset/gradle/dependency-management.gradle b/buildSrc/src/test/resources/samples/dependencyset/gradle/dependency-management.gradle
index 032446af5f..976cb16fe2 100644
--- a/buildSrc/src/test/resources/samples/dependencyset/gradle/dependency-management.gradle
+++ b/buildSrc/src/test/resources/samples/dependencyset/gradle/dependency-management.gradle
@@ -704,13 +704,7 @@ def deps = [
"xml-apis:xml-apis" : "1.4.01",
"xmlunit:xmlunit" : "1.6",
"xom:xom" : "1.2.5",
- "org.gebish:geb-spock" : "1.1.1",
- "org.powermock:powermock-core" : "1.6.2",
- "org.powermock:powermock-api-support" : "1.6.2",
- "org.powermock:powermock-module-junit4-common" : "1.6.2",
- "org.powermock:powermock-module-junit4" : "1.6.2",
- "org.powermock:powermock-api-mockito" : "1.6.2",
- "org.powermock:powermock-reflect" : "1.6.2"
+ "org.gebish:geb-spock" : "1.1.1"
]
configurations.all {
@@ -721,4 +715,4 @@ configurations.all {
details.useVersion deps[id]
}
}
-}
\ No newline at end of file
+}
diff --git a/config/spring-security-config.gradle b/config/spring-security-config.gradle
index 12ea1e09f4..f52b4c0908 100644
--- a/config/spring-security-config.gradle
+++ b/config/spring-security-config.gradle
@@ -52,7 +52,6 @@ dependencies {
testImplementation project(path: ':spring-security-saml2-service-provider', configuration: 'opensaml4MainCompile')
testImplementation project(path : ':spring-security-web', configuration : 'tests')
testImplementation apachedsDependencies
- testImplementation powerMock2Dependencies
testImplementation 'com.squareup.okhttp3:mockwebserver'
testImplementation 'ch.qos.logback:logback-classic'
testImplementation 'io.projectreactor.netty:reactor-netty'
@@ -66,6 +65,8 @@ dependencies {
testImplementation 'org.eclipse.persistence:javax.persistence'
testImplementation 'org.hibernate:hibernate-entitymanager'
testImplementation 'org.hsqldb:hsqldb'
+ testImplementation 'org.mockito:mockito-core'
+ testImplementation "org.mockito:mockito-inline"
testImplementation ('org.openid4java:openid4java-nodeps') {
exclude group: 'com.google.code.guice', module: 'guice'
}
diff --git a/config/src/test/java/org/springframework/security/config/SecurityNamespaceHandlerTests.java b/config/src/test/java/org/springframework/security/config/SecurityNamespaceHandlerTests.java
index 38f9f30861..4249c5af10 100644
--- a/config/src/test/java/org/springframework/security/config/SecurityNamespaceHandlerTests.java
+++ b/config/src/test/java/org/springframework/security/config/SecurityNamespaceHandlerTests.java
@@ -19,13 +19,12 @@ package org.springframework.security.config;
import org.apache.commons.logging.Log;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
-import org.springframework.messaging.Message;
import org.springframework.security.config.util.InMemoryXmlApplicationContext;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.util.ClassUtils;
@@ -41,9 +40,7 @@ import static org.mockito.Mockito.verifyZeroInteractions;
* @author Rob Winch
* @since 3.0
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ ClassUtils.class })
-@PowerMockIgnore({ "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*" })
+@RunWith(MockitoJUnitRunner.class)
public class SecurityNamespaceHandlerTests {
// @formatter:off
@@ -60,6 +57,9 @@ public class SecurityNamespaceHandlerTests {
private static final String FILTER_CHAIN_PROXY_CLASSNAME = "org.springframework.security.web.FilterChainProxy";
+ @Mock(answer = Answers.CALLS_REAL_METHODS)
+ private MockedStatic classUtils;
+
@Test
public void constructionSucceeds() {
new SecurityNamespaceHandler();
@@ -83,24 +83,18 @@ public class SecurityNamespaceHandlerTests {
@Test
public void initDoesNotLogErrorWhenFilterChainProxyFailsToLoad() throws Exception {
String className = "javax.servlet.Filter";
- PowerMockito.spy(ClassUtils.class);
- PowerMockito.doThrow(new NoClassDefFoundError(className)).when(ClassUtils.class, "forName",
- eq(FILTER_CHAIN_PROXY_CLASSNAME), any(ClassLoader.class));
Log logger = mock(Log.class);
SecurityNamespaceHandler handler = new SecurityNamespaceHandler();
ReflectionTestUtils.setField(handler, "logger", logger);
+ expectClassUtilsForNameThrowsNoClassDefFoundError(className);
handler.init();
- PowerMockito.verifyStatic(ClassUtils.class);
- ClassUtils.forName(eq(FILTER_CHAIN_PROXY_CLASSNAME), any(ClassLoader.class));
verifyZeroInteractions(logger);
}
@Test
public void filterNoClassDefFoundError() throws Exception {
String className = "javax.servlet.Filter";
- PowerMockito.spy(ClassUtils.class);
- PowerMockito.doThrow(new NoClassDefFoundError(className)).when(ClassUtils.class, "forName",
- eq(FILTER_CHAIN_PROXY_CLASSNAME), any(ClassLoader.class));
+ expectClassUtilsForNameThrowsNoClassDefFoundError(className);
assertThatExceptionOfType(BeanDefinitionParsingException.class)
.isThrownBy(() -> new InMemoryXmlApplicationContext(XML_AUTHENTICATION_MANAGER + XML_HTTP_BLOCK))
.withMessageContaining("NoClassDefFoundError: " + className);
@@ -109,9 +103,7 @@ public class SecurityNamespaceHandlerTests {
@Test
public void filterNoClassDefFoundErrorNoHttpBlock() throws Exception {
String className = "javax.servlet.Filter";
- PowerMockito.spy(ClassUtils.class);
- PowerMockito.doThrow(new NoClassDefFoundError(className)).when(ClassUtils.class, "forName",
- eq(FILTER_CHAIN_PROXY_CLASSNAME), any(ClassLoader.class));
+ expectClassUtilsForNameThrowsNoClassDefFoundError(className);
new InMemoryXmlApplicationContext(XML_AUTHENTICATION_MANAGER);
// should load just fine since no http block
}
@@ -119,9 +111,7 @@ public class SecurityNamespaceHandlerTests {
@Test
public void filterChainProxyClassNotFoundException() throws Exception {
String className = FILTER_CHAIN_PROXY_CLASSNAME;
- PowerMockito.spy(ClassUtils.class);
- PowerMockito.doThrow(new ClassNotFoundException(className)).when(ClassUtils.class, "forName",
- eq(FILTER_CHAIN_PROXY_CLASSNAME), any(ClassLoader.class));
+ expectClassUtilsForNameThrowsClassNotFoundException(className);
assertThatExceptionOfType(BeanDefinitionParsingException.class)
.isThrownBy(() -> new InMemoryXmlApplicationContext(XML_AUTHENTICATION_MANAGER + XML_HTTP_BLOCK))
.withMessageContaining("ClassNotFoundException: " + className);
@@ -130,9 +120,7 @@ public class SecurityNamespaceHandlerTests {
@Test
public void filterChainProxyClassNotFoundExceptionNoHttpBlock() throws Exception {
String className = FILTER_CHAIN_PROXY_CLASSNAME;
- PowerMockito.spy(ClassUtils.class);
- PowerMockito.doThrow(new ClassNotFoundException(className)).when(ClassUtils.class, "forName",
- eq(FILTER_CHAIN_PROXY_CLASSNAME), any(ClassLoader.class));
+ expectClassUtilsForNameThrowsClassNotFoundException(className);
new InMemoryXmlApplicationContext(XML_AUTHENTICATION_MANAGER);
// should load just fine since no http block
}
@@ -140,11 +128,19 @@ public class SecurityNamespaceHandlerTests {
@Test
public void websocketNotFoundExceptionNoMessageBlock() throws Exception {
String className = FILTER_CHAIN_PROXY_CLASSNAME;
- PowerMockito.spy(ClassUtils.class);
- PowerMockito.doThrow(new ClassNotFoundException(className)).when(ClassUtils.class, "forName",
- eq(Message.class.getName()), any(ClassLoader.class));
+ expectClassUtilsForNameThrowsClassNotFoundException(className);
new InMemoryXmlApplicationContext(XML_AUTHENTICATION_MANAGER);
// should load just fine since no websocket block
}
+ private void expectClassUtilsForNameThrowsNoClassDefFoundError(String className) {
+ this.classUtils.when(() -> ClassUtils.forName(eq(FILTER_CHAIN_PROXY_CLASSNAME), any()))
+ .thenThrow(new NoClassDefFoundError(className));
+ }
+
+ private void expectClassUtilsForNameThrowsClassNotFoundException(String className) {
+ this.classUtils.when(() -> ClassUtils.forName(eq(FILTER_CHAIN_PROXY_CLASSNAME), any()))
+ .thenThrow(new ClassNotFoundException(className));
+ }
+
}
diff --git a/config/src/test/java/org/springframework/security/config/annotation/web/WebSecurityConfigurerAdapterPowermockTests.java b/config/src/test/java/org/springframework/security/config/annotation/web/WebSecurityConfigurerAdapterMockitoTests.java
similarity index 87%
rename from config/src/test/java/org/springframework/security/config/annotation/web/WebSecurityConfigurerAdapterPowermockTests.java
rename to config/src/test/java/org/springframework/security/config/annotation/web/WebSecurityConfigurerAdapterMockitoTests.java
index cccc804823..2125181171 100644
--- a/config/src/test/java/org/springframework/security/config/annotation/web/WebSecurityConfigurerAdapterPowermockTests.java
+++ b/config/src/test/java/org/springframework/security/config/annotation/web/WebSecurityConfigurerAdapterMockitoTests.java
@@ -23,10 +23,9 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.support.SpringFactoriesLoader;
@@ -56,11 +55,8 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
* @author Rob Winch
*
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ SpringFactoriesLoader.class, WebAsyncManager.class })
-@PowerMockIgnore({ "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*",
- "javax.xml.transform.*" })
-public class WebSecurityConfigurerAdapterPowermockTests {
+@RunWith(MockitoJUnitRunner.class)
+public class WebSecurityConfigurerAdapterMockitoTests {
ConfigurableWebApplicationContext context;
@@ -70,6 +66,9 @@ public class WebSecurityConfigurerAdapterPowermockTests {
@Autowired
private MockMvc mockMvc;
+ @Mock
+ private MockedStatic springFactoriesLoader;
+
@After
public void close() {
if (this.context != null) {
@@ -79,11 +78,10 @@ public class WebSecurityConfigurerAdapterPowermockTests {
@Test
public void loadConfigWhenDefaultConfigurerAsSpringFactoryhenDefaultConfigurerApplied() {
- PowerMockito.spy(SpringFactoriesLoader.class);
DefaultConfigurer configurer = new DefaultConfigurer();
- PowerMockito
- .when(SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, getClass().getClassLoader()))
- .thenReturn(Arrays.asList(configurer));
+ this.springFactoriesLoader.when(
+ () -> SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, getClass().getClassLoader()))
+ .thenReturn(Arrays.asList(configurer));
loadConfig(Config.class);
assertThat(configurer.init).isTrue();
assertThat(configurer.configure).isTrue();
diff --git a/config/src/test/java/org/springframework/security/config/annotation/web/configurers/SessionManagementConfigurerServlet31Tests.java b/config/src/test/java/org/springframework/security/config/annotation/web/configurers/SessionManagementConfigurerServlet31Tests.java
index 53f7b0ec8a..af565d7ba3 100644
--- a/config/src/test/java/org/springframework/security/config/annotation/web/configurers/SessionManagementConfigurerServlet31Tests.java
+++ b/config/src/test/java/org/springframework/security/config/annotation/web/configurers/SessionManagementConfigurerServlet31Tests.java
@@ -16,17 +16,11 @@
package org.springframework.security.config.annotation.web.configurers;
-import java.lang.reflect.Method;
-
import javax.servlet.Filter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@@ -50,13 +44,8 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Rob Winch
*/
-@RunWith(PowerMockRunner.class)
-@PowerMockIgnore({ "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*" })
public class SessionManagementConfigurerServlet31Tests {
- @Mock
- Method method;
-
MockHttpServletRequest request;
MockHttpServletResponse response;
diff --git a/config/src/test/java/org/springframework/security/config/http/SessionManagementConfigServlet31Tests.java b/config/src/test/java/org/springframework/security/config/http/SessionManagementConfigServlet31Tests.java
index b9e488cc11..5be74bcab5 100644
--- a/config/src/test/java/org/springframework/security/config/http/SessionManagementConfigServlet31Tests.java
+++ b/config/src/test/java/org/springframework/security/config/http/SessionManagementConfigServlet31Tests.java
@@ -16,18 +16,11 @@
package org.springframework.security.config.http;
-import java.lang.reflect.Method;
-
import javax.servlet.Filter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.mock.web.MockFilterChain;
@@ -38,7 +31,6 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.web.context.HttpRequestResponseHolder;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
-import org.springframework.util.ReflectionUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -46,9 +38,6 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Rob Winch
*
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ ReflectionUtils.class, Method.class })
-@PowerMockIgnore({ "org.w3c.dom.*", "org.xml.sax.*", "org.apache.xerces.*", "javax.xml.parsers.*" })
public class SessionManagementConfigServlet31Tests {
// @formatter:off
@@ -61,9 +50,6 @@ public class SessionManagementConfigServlet31Tests {
+ "";
// @formatter:on
- @Mock
- Method method;
-
MockHttpServletRequest request;
MockHttpServletResponse response;
diff --git a/config/src/test/java/org/springframework/security/config/http/WebConfigUtilsTests.java b/config/src/test/java/org/springframework/security/config/http/WebConfigUtilsTests.java
index 7268e6400c..0199cbbb4f 100644
--- a/config/src/test/java/org/springframework/security/config/http/WebConfigUtilsTests.java
+++ b/config/src/test/java/org/springframework/security/config/http/WebConfigUtilsTests.java
@@ -19,15 +19,13 @@ package org.springframework.security.config.http;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.powermock.core.classloader.annotations.PrepareOnlyThisForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.beans.factory.xml.ParserContext;
import static org.mockito.Mockito.verifyZeroInteractions;
-@RunWith(PowerMockRunner.class)
-@PrepareOnlyThisForTest(ParserContext.class)
+@RunWith(MockitoJUnitRunner.class)
public class WebConfigUtilsTests {
public static final String URL = "/url";
diff --git a/core/spring-security-core.gradle b/core/spring-security-core.gradle
index b5262dbe7c..c2e3e92acf 100644
--- a/core/spring-security-core.gradle
+++ b/core/spring-security-core.gradle
@@ -20,9 +20,10 @@ dependencies {
optional 'org.springframework:spring-tx'
optional 'org.jetbrains.kotlinx:kotlinx-coroutines-reactor'
- testImplementation powerMock2Dependencies
testImplementation 'commons-collections:commons-collections'
testImplementation 'io.projectreactor:reactor-test'
+ testImplementation 'org.mockito:mockito-core'
+ testImplementation 'org.mockito:mockito-inline'
testImplementation 'org.skyscreamer:jsonassert'
testImplementation 'org.slf4j:jcl-over-slf4j'
testImplementation 'org.springframework:spring-test'
diff --git a/core/src/test/java/org/springframework/security/concurrent/AbstractDelegatingSecurityContextTestSupport.java b/core/src/test/java/org/springframework/security/concurrent/AbstractDelegatingSecurityContextTestSupport.java
index 8e1de868f0..75cc49275f 100644
--- a/core/src/test/java/org/springframework/security/concurrent/AbstractDelegatingSecurityContextTestSupport.java
+++ b/core/src/test/java/org/springframework/security/concurrent/AbstractDelegatingSecurityContextTestSupport.java
@@ -24,9 +24,8 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.MockedStatic;
+import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
@@ -41,8 +40,7 @@ import static org.mockito.ArgumentMatchers.eq;
* @since 3.2
*
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ DelegatingSecurityContextRunnable.class, DelegatingSecurityContextCallable.class })
+@RunWith(MockitoJUnitRunner.class)
public abstract class AbstractDelegatingSecurityContextTestSupport {
@Mock
@@ -66,22 +64,26 @@ public abstract class AbstractDelegatingSecurityContextTestSupport {
@Mock
protected Runnable wrappedRunnable;
- public final void explicitSecurityContextPowermockSetup() throws Exception {
- PowerMockito.spy(DelegatingSecurityContextCallable.class);
- PowerMockito.doReturn(this.wrappedCallable).when(DelegatingSecurityContextCallable.class, "create",
- eq(this.callable), this.securityContextCaptor.capture());
- PowerMockito.spy(DelegatingSecurityContextRunnable.class);
- PowerMockito.doReturn(this.wrappedRunnable).when(DelegatingSecurityContextRunnable.class, "create",
- eq(this.runnable), this.securityContextCaptor.capture());
+ @Mock
+ protected MockedStatic delegatingSecurityContextCallable;
+
+ @Mock
+ protected MockedStatic delegatingSecurityContextRunnable;
+
+ public final void explicitSecurityContextSetup() throws Exception {
+ this.delegatingSecurityContextCallable.when(
+ () -> DelegatingSecurityContextCallable.create(eq(this.callable), this.securityContextCaptor.capture()))
+ .thenReturn(this.wrappedCallable);
+ this.delegatingSecurityContextRunnable.when(
+ () -> DelegatingSecurityContextRunnable.create(eq(this.runnable), this.securityContextCaptor.capture()))
+ .thenReturn(this.wrappedRunnable);
}
- public final void currentSecurityContextPowermockSetup() throws Exception {
- PowerMockito.spy(DelegatingSecurityContextCallable.class);
- PowerMockito.doReturn(this.wrappedCallable).when(DelegatingSecurityContextCallable.class, "create",
- this.callable, null);
- PowerMockito.spy(DelegatingSecurityContextRunnable.class);
- PowerMockito.doReturn(this.wrappedRunnable).when(DelegatingSecurityContextRunnable.class, "create",
- this.runnable, null);
+ public final void currentSecurityContextSetup() throws Exception {
+ this.delegatingSecurityContextCallable.when(() -> DelegatingSecurityContextCallable.create(this.callable, null))
+ .thenReturn(this.wrappedCallable);
+ this.delegatingSecurityContextRunnable.when(() -> DelegatingSecurityContextRunnable.create(this.runnable, null))
+ .thenReturn(this.wrappedRunnable);
}
@Before
diff --git a/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorServiceTests.java b/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorServiceTests.java
index 7579e28448..1ace46f691 100644
--- a/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorServiceTests.java
+++ b/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorServiceTests.java
@@ -33,7 +33,7 @@ public class CurrentDelegatingSecurityContextExecutorServiceTests
@Before
public void setUp() throws Exception {
- super.currentSecurityContextPowermockSetup();
+ super.currentSecurityContextSetup();
}
@Override
diff --git a/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorTests.java b/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorTests.java
index 65a597aa9b..ff5cb3eb28 100644
--- a/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorTests.java
+++ b/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextExecutorTests.java
@@ -32,7 +32,7 @@ public class CurrentDelegatingSecurityContextExecutorTests extends AbstractDeleg
@Before
public void setUp() throws Exception {
- super.currentSecurityContextPowermockSetup();
+ super.currentSecurityContextSetup();
}
@Override
diff --git a/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextScheduledExecutorServiceTests.java b/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextScheduledExecutorServiceTests.java
index b3eb423d54..c13d980969 100644
--- a/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextScheduledExecutorServiceTests.java
+++ b/core/src/test/java/org/springframework/security/concurrent/CurrentDelegatingSecurityContextScheduledExecutorServiceTests.java
@@ -33,7 +33,7 @@ public class CurrentDelegatingSecurityContextScheduledExecutorServiceTests
@Before
public void setUp() throws Exception {
- this.currentSecurityContextPowermockSetup();
+ this.currentSecurityContextSetup();
}
@Override
diff --git a/core/src/test/java/org/springframework/security/concurrent/DelegatingSecurityContextSupportTests.java b/core/src/test/java/org/springframework/security/concurrent/DelegatingSecurityContextSupportTests.java
index f311782752..948e059521 100644
--- a/core/src/test/java/org/springframework/security/concurrent/DelegatingSecurityContextSupportTests.java
+++ b/core/src/test/java/org/springframework/security/concurrent/DelegatingSecurityContextSupportTests.java
@@ -33,7 +33,7 @@ public class DelegatingSecurityContextSupportTests extends AbstractDelegatingSec
@Test
public void wrapCallable() throws Exception {
- explicitSecurityContextPowermockSetup();
+ explicitSecurityContextSetup();
this.support = new ConcreteDelegatingSecurityContextSupport(this.securityContext);
assertThat(this.support.wrap(this.callable)).isSameAs(this.wrappedCallable);
assertThat(this.securityContextCaptor.getValue()).isSameAs(this.securityContext);
@@ -41,14 +41,14 @@ public class DelegatingSecurityContextSupportTests extends AbstractDelegatingSec
@Test
public void wrapCallableNullSecurityContext() throws Exception {
- currentSecurityContextPowermockSetup();
+ currentSecurityContextSetup();
this.support = new ConcreteDelegatingSecurityContextSupport(null);
assertThat(this.support.wrap(this.callable)).isSameAs(this.wrappedCallable);
}
@Test
public void wrapRunnable() throws Exception {
- explicitSecurityContextPowermockSetup();
+ explicitSecurityContextSetup();
this.support = new ConcreteDelegatingSecurityContextSupport(this.securityContext);
assertThat(this.support.wrap(this.runnable)).isSameAs(this.wrappedRunnable);
assertThat(this.securityContextCaptor.getValue()).isSameAs(this.securityContext);
@@ -56,7 +56,7 @@ public class DelegatingSecurityContextSupportTests extends AbstractDelegatingSec
@Test
public void wrapRunnableNullSecurityContext() throws Exception {
- currentSecurityContextPowermockSetup();
+ currentSecurityContextSetup();
this.support = new ConcreteDelegatingSecurityContextSupport(null);
assertThat(this.support.wrap(this.runnable)).isSameAs(this.wrappedRunnable);
}
diff --git a/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorServiceTests.java b/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorServiceTests.java
index e2b2681e5c..27b82372c8 100644
--- a/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorServiceTests.java
+++ b/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorServiceTests.java
@@ -33,7 +33,7 @@ public class ExplicitDelegatingSecurityContextExecutorServiceTests
@Before
public void setUp() throws Exception {
- super.explicitSecurityContextPowermockSetup();
+ super.explicitSecurityContextSetup();
}
@Override
diff --git a/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorTests.java b/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorTests.java
index 232012d27f..bc90ea3843 100644
--- a/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorTests.java
+++ b/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextExecutorTests.java
@@ -32,7 +32,7 @@ public class ExplicitDelegatingSecurityContextExecutorTests extends AbstractDele
@Before
public void setUp() throws Exception {
- super.explicitSecurityContextPowermockSetup();
+ super.explicitSecurityContextSetup();
}
@Override
diff --git a/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextScheduledExecutorServiceTests.java b/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextScheduledExecutorServiceTests.java
index a59bd8164f..3f7423cb79 100644
--- a/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextScheduledExecutorServiceTests.java
+++ b/core/src/test/java/org/springframework/security/concurrent/ExplicitDelegatingSecurityContextScheduledExecutorServiceTests.java
@@ -33,7 +33,7 @@ public class ExplicitDelegatingSecurityContextScheduledExecutorServiceTests
@Before
public void setUp() throws Exception {
- this.explicitSecurityContextPowermockSetup();
+ this.explicitSecurityContextSetup();
}
@Override
diff --git a/core/src/test/java/org/springframework/security/core/SpringSecurityCoreVersionTests.java b/core/src/test/java/org/springframework/security/core/SpringSecurityCoreVersionTests.java
index 33b297c385..003862311d 100644
--- a/core/src/test/java/org/springframework/security/core/SpringSecurityCoreVersionTests.java
+++ b/core/src/test/java/org/springframework/security/core/SpringSecurityCoreVersionTests.java
@@ -16,18 +16,22 @@
package org.springframework.security.core;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Answers;
import org.mockito.Mock;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-import org.powermock.reflect.Whitebox;
+import org.mockito.MockedStatic;
+import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.core.SpringVersion;
+import org.springframework.util.ReflectionUtils;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -42,21 +46,29 @@ import static org.mockito.Mockito.verifyZeroInteractions;
* @author Luke Taylor
* @author Rob Winch
*/
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ SpringSecurityCoreVersion.class, SpringVersion.class })
+@RunWith(MockitoJUnitRunner.class)
public class SpringSecurityCoreVersionTests {
@Mock
private Log logger;
+ @Mock(answer = Answers.CALLS_REAL_METHODS)
+ private MockedStatic springVersion;
+
+ @Mock(answer = Answers.CALLS_REAL_METHODS)
+ private MockedStatic springSecurityCoreVersion;
+
@Before
- public void setup() {
- Whitebox.setInternalState(SpringSecurityCoreVersion.class, this.logger);
+ public void setup() throws Exception {
+ Field logger = ReflectionUtils.findField(SpringSecurityCoreVersion.class, "logger");
+ StaticFinalReflectionUtils.setField(logger, this.logger);
}
@After
public void cleanup() throws Exception {
System.clearProperty(getDisableChecksProperty());
+ Field logger = ReflectionUtils.findField(SpringSecurityCoreVersion.class, "logger");
+ StaticFinalReflectionUtils.setField(logger, LogFactory.getLog(SpringSecurityCoreVersion.class));
}
@Test
@@ -79,40 +91,34 @@ public class SpringSecurityCoreVersionTests {
@Test
public void noLoggingIfVersionsAreEqual() throws Exception {
String version = "1";
- PowerMockito.spy(SpringSecurityCoreVersion.class);
- PowerMockito.spy(SpringVersion.class);
- PowerMockito.doReturn(version).when(SpringSecurityCoreVersion.class, "getVersion");
- PowerMockito.doReturn(version).when(SpringVersion.class, "getVersion");
+ expectSpringSecurityVersionThenReturn(version);
+ expectSpringVersionThenReturn(version);
performChecks();
verifyZeroInteractions(this.logger);
}
@Test
public void noLoggingIfSpringVersionNull() throws Exception {
- PowerMockito.spy(SpringSecurityCoreVersion.class);
- PowerMockito.spy(SpringVersion.class);
- PowerMockito.doReturn("1").when(SpringSecurityCoreVersion.class, "getVersion");
- PowerMockito.doReturn(null).when(SpringVersion.class, "getVersion");
+ String version = "1";
+ expectSpringSecurityVersionThenReturn(version);
+ expectSpringVersionThenReturn(null);
performChecks();
verifyZeroInteractions(this.logger);
}
@Test
public void warnIfSpringVersionTooSmall() throws Exception {
- PowerMockito.spy(SpringSecurityCoreVersion.class);
- PowerMockito.spy(SpringVersion.class);
- PowerMockito.doReturn("3").when(SpringSecurityCoreVersion.class, "getVersion");
- PowerMockito.doReturn("2").when(SpringVersion.class, "getVersion");
+ expectSpringSecurityVersionThenReturn("3");
+ expectSpringVersionThenReturn("2");
performChecks();
verify(this.logger, times(1)).warn(any());
}
@Test
public void noWarnIfSpringVersionLarger() throws Exception {
- PowerMockito.spy(SpringSecurityCoreVersion.class);
- PowerMockito.spy(SpringVersion.class);
- PowerMockito.doReturn("4.0.0.RELEASE").when(SpringSecurityCoreVersion.class, "getVersion");
- PowerMockito.doReturn("4.0.0.RELEASE").when(SpringVersion.class, "getVersion");
+ String version = "4.0.0.RELEASE";
+ expectSpringSecurityVersionThenReturn(version);
+ expectSpringVersionThenReturn(version);
performChecks();
verify(this.logger, never()).warn(any());
}
@@ -121,20 +127,16 @@ public class SpringSecurityCoreVersionTests {
@Test
public void noWarnIfSpringPatchVersionDoubleDigits() throws Exception {
String minSpringVersion = "3.2.8.RELEASE";
- PowerMockito.spy(SpringSecurityCoreVersion.class);
- PowerMockito.spy(SpringVersion.class);
- PowerMockito.doReturn("3.2.0.RELEASE").when(SpringSecurityCoreVersion.class, "getVersion");
- PowerMockito.doReturn("3.2.10.RELEASE").when(SpringVersion.class, "getVersion");
+ expectSpringSecurityVersionThenReturn("3.2.0.RELEASE");
+ expectSpringVersionThenReturn("3.2.10.RELEASE");
performChecks(minSpringVersion);
verify(this.logger, never()).warn(any());
}
@Test
public void noLoggingIfPropertySet() throws Exception {
- PowerMockito.spy(SpringSecurityCoreVersion.class);
- PowerMockito.spy(SpringVersion.class);
- PowerMockito.doReturn("3").when(SpringSecurityCoreVersion.class, "getVersion");
- PowerMockito.doReturn("2").when(SpringVersion.class, "getVersion");
+ expectSpringSecurityVersionThenReturn("3");
+ expectSpringVersionThenReturn("2");
System.setProperty(getDisableChecksProperty(), Boolean.TRUE.toString());
performChecks();
verifyZeroInteractions(this.logger);
@@ -144,12 +146,25 @@ public class SpringSecurityCoreVersionTests {
return SpringSecurityCoreVersion.class.getName().concat(".DISABLE_CHECKS");
}
- private void performChecks() throws Exception {
- Whitebox.invokeMethod(SpringSecurityCoreVersion.class, "performVersionChecks");
+ private void performChecks() {
+ Method method = ReflectionUtils.findMethod(SpringSecurityCoreVersion.class, "performVersionChecks");
+ ReflectionUtils.makeAccessible(method);
+ ReflectionUtils.invokeMethod(method, null);
}
- private void performChecks(String minSpringVersion) throws Exception {
- Whitebox.invokeMethod(SpringSecurityCoreVersion.class, "performVersionChecks", minSpringVersion);
+ private void performChecks(String minSpringVersion) {
+ Method method = ReflectionUtils.findMethod(SpringSecurityCoreVersion.class, "performVersionChecks",
+ String.class);
+ ReflectionUtils.makeAccessible(method);
+ ReflectionUtils.invokeMethod(method, null, minSpringVersion);
+ }
+
+ private void expectSpringSecurityVersionThenReturn(String version) {
+ this.springSecurityCoreVersion.when(SpringSecurityCoreVersion::getVersion).thenReturn(version);
+ }
+
+ private void expectSpringVersionThenReturn(String version) {
+ this.springVersion.when(SpringVersion::getVersion).thenReturn(version);
}
}
diff --git a/core/src/test/java/org/springframework/security/core/StaticFinalReflectionUtils.java b/core/src/test/java/org/springframework/security/core/StaticFinalReflectionUtils.java
new file mode 100644
index 0000000000..1cff222680
--- /dev/null
+++ b/core/src/test/java/org/springframework/security/core/StaticFinalReflectionUtils.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2008 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
+ *
+ * https://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.core;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import sun.misc.Unsafe;
+
+import org.springframework.objenesis.instantiator.util.UnsafeUtils;
+
+/**
+ * Used for setting static variables even if they are private static final.
+ *
+ * The code in this class has been adopted from Powermock's WhiteboxImpl.
+ *
+ * @author Rob Winch
+ */
+final class StaticFinalReflectionUtils {
+
+ /**
+ * Used to support setting static fields that are final using Java's Unsafe. If the
+ * field is not static final, use
+ * {@link org.springframework.test.util.ReflectionTestUtils}.
+ * @param field the field to set
+ * @param newValue the new value
+ */
+ static void setField(final Field field, final Object newValue) {
+ try {
+ field.setAccessible(true);
+ int fieldModifiersMask = field.getModifiers();
+ boolean isFinalModifierPresent = (fieldModifiersMask & Modifier.FINAL) == Modifier.FINAL;
+ if (isFinalModifierPresent) {
+ AccessController.doPrivileged(new PrivilegedAction