From ad5c636affce5e1b123981ab32c668f79b2c09c8 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Tue, 17 Jan 2023 14:31:11 +0100 Subject: [PATCH] Upgrade to Mockito 5.0 --- framework-platform/framework-platform.gradle | 2 +- ...wiredAnnotationBeanPostProcessorTests.java | 13 ++++- .../support/BeanFactoryGenericsTests.java | 52 +++++++++++-------- .../servlet/samples/context/root-context.xml | 2 +- spring-webflux/spring-webflux.gradle | 1 + 5 files changed, 43 insertions(+), 27 deletions(-) diff --git a/framework-platform/framework-platform.gradle b/framework-platform/framework-platform.gradle index b0af0c35e6..b5cf21b900 100644 --- a/framework-platform/framework-platform.gradle +++ b/framework-platform/framework-platform.gradle @@ -19,7 +19,7 @@ dependencies { api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4")) api(platform("org.jetbrains.kotlinx:kotlinx-serialization-bom:1.4.0")) api(platform("org.junit:junit-bom:5.9.2")) - api(platform("org.mockito:mockito-bom:4.9.0")) // spring-beans tests fail with 4.10+ + api(platform("org.mockito:mockito-bom:5.0.0")) constraints { api("com.fasterxml:aalto-xml:1.3.1") diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java index f2b110f58f..1d2c2950e4 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java @@ -1928,8 +1928,8 @@ public class AutowiredAnnotationBeanPostProcessorTests { bf.registerBeanDefinition("annotatedBean", bd); RootBeanDefinition rbd = new RootBeanDefinition(); - rbd.setBeanClassName(Mockito.class.getName()); - rbd.setFactoryMethodName("mock"); + rbd.setBeanClassName(getClass().getName()); + rbd.setFactoryMethodName("createMockitoMock"); // TypedStringValue used to be equivalent to an XML-defined argument String rbd.getConstructorArgumentValues().addGenericArgumentValue(new TypedStringValue(Repository.class.getName())); bf.registerBeanDefinition("repo", rbd); @@ -1952,6 +1952,15 @@ public class AutowiredAnnotationBeanPostProcessorTests { assertThat(bean.stringRepositoryMap.get("repo")).isSameAs(repo); } + /** + * Mimics and delegates to {@link Mockito#mock(Class)} -- created here to avoid factory + * method resolution issues caused by the introduction of {@code Mockito.mock(T...)} + * in Mockito 4.10. + */ + public static T createMockitoMock(Class classToMock) { + return Mockito.mock(classToMock); + } + @Test public void testGenericsBasedMethodInjection() { RootBeanDefinition bd = new RootBeanDefinition(RepositoryMethodInjectionBean.class); diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanFactoryGenericsTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanFactoryGenericsTests.java index c71e1947e7..a9f943ae28 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanFactoryGenericsTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanFactoryGenericsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 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. @@ -659,14 +659,29 @@ class BeanFactoryGenericsTests { */ @Test void parameterizedStaticFactoryMethod() { - RootBeanDefinition rbd = new RootBeanDefinition(Mockito.class); - rbd.setFactoryMethodName("mock"); + RootBeanDefinition rbd = new RootBeanDefinition(getClass()); + rbd.setFactoryMethodName("createMockitoMock"); rbd.getConstructorArgumentValues().addGenericArgumentValue(Runnable.class); + assertRunnableMockFactory(rbd); + } + + @Test + void parameterizedStaticFactoryMethodWithWrappedClassName() { + RootBeanDefinition rbd = new RootBeanDefinition(); + rbd.setBeanClassName(getClass().getName()); + rbd.setFactoryMethodName("createMockitoMock"); + // TypedStringValue is used as an equivalent to an XML-defined argument String + rbd.getConstructorArgumentValues().addGenericArgumentValue(new TypedStringValue(Runnable.class.getName())); + + assertRunnableMockFactory(rbd); + } + + private void assertRunnableMockFactory(RootBeanDefinition rbd) { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.registerBeanDefinition("mock", rbd); - assertThat(bf.getType("mock")).isEqualTo(Runnable.class); + assertThat(bf.isTypeMatch("mock", Runnable.class)).isTrue(); assertThat(bf.getType("mock")).isEqualTo(Runnable.class); Map beans = bf.getBeansOfType(Runnable.class); assertThat(beans).hasSize(1); @@ -725,25 +740,6 @@ class BeanFactoryGenericsTests { assertThat(beans).hasSize(1); } - @Test - void parameterizedInstanceFactoryMethodWithWrappedClassName() { - DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); - - RootBeanDefinition rbd = new RootBeanDefinition(); - rbd.setBeanClassName(Mockito.class.getName()); - rbd.setFactoryMethodName("mock"); - // TypedStringValue used to be equivalent to an XML-defined argument String - rbd.getConstructorArgumentValues().addGenericArgumentValue(new TypedStringValue(Runnable.class.getName())); - bf.registerBeanDefinition("mock", rbd); - - assertThat(bf.isTypeMatch("mock", Runnable.class)).isTrue(); - assertThat(bf.isTypeMatch("mock", Runnable.class)).isTrue(); - assertThat(bf.getType("mock")).isEqualTo(Runnable.class); - assertThat(bf.getType("mock")).isEqualTo(Runnable.class); - Map beans = bf.getBeansOfType(Runnable.class); - assertThat(beans).hasSize(1); - } - @Test void parameterizedInstanceFactoryMethodWithInvalidClassName() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); @@ -945,6 +941,16 @@ class BeanFactoryGenericsTests { } + /** + * Mimics and delegates to {@link Mockito#mock(Class)} -- created here to avoid factory + * method resolution issues caused by the introduction of {@code Mockito.mock(T...)} + * in Mockito 4.10. + */ + public static T createMockitoMock(Class classToMock) { + return Mockito.mock(classToMock); + } + + @SuppressWarnings("serial") public static class NamedUrlList extends ArrayList { } diff --git a/spring-test/src/test/resources/org/springframework/test/web/servlet/samples/context/root-context.xml b/spring-test/src/test/resources/org/springframework/test/web/servlet/samples/context/root-context.xml index 68812aeff5..ad10862f62 100644 --- a/spring-test/src/test/resources/org/springframework/test/web/servlet/samples/context/root-context.xml +++ b/spring-test/src/test/resources/org/springframework/test/web/servlet/samples/context/root-context.xml @@ -6,7 +6,7 @@ https://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> - + \ No newline at end of file diff --git a/spring-webflux/spring-webflux.gradle b/spring-webflux/spring-webflux.gradle index b7cc4daf2d..f3e3f8f9b7 100644 --- a/spring-webflux/spring-webflux.gradle +++ b/spring-webflux/spring-webflux.gradle @@ -40,6 +40,7 @@ dependencies { testImplementation("jakarta.validation:jakarta.validation-api") testImplementation("io.reactivex.rxjava3:rxjava") testImplementation("io.projectreactor:reactor-test") + testImplementation("io.projectreactor.tools:blockhound") // required by Mockito 5's default MockMaker in order to mock ReactiveAdapterRegistry which "contains" SpringCoreBlockHoundIntegration testImplementation("io.micrometer:micrometer-observation-test") testImplementation("io.undertow:undertow-core") testImplementation("org.apache.tomcat.embed:tomcat-embed-core")