From 996e66abdbaad866f0eab40bcf5628cdea92e046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Tue, 26 Mar 2024 18:14:56 +0100 Subject: [PATCH] Perform NullAway build-time checks in spring-test Closes gh-32475 --- gradle/spring-module.gradle | 3 +-- .../test/context/aot/TestContextAotGenerator.java | 1 + .../bean/override/BeanOverrideBeanPostProcessor.java | 6 +++++- .../bean/override/BeanOverrideContextCustomizerFactory.java | 2 ++ .../test/context/bean/override/BeanOverrideParser.java | 5 ++++- .../test/context/bean/override/mockito/MockDefinition.java | 2 +- .../override/mockito/MockitoResetTestExecutionListener.java | 2 ++ .../test/context/jdbc/SqlScriptsTestExecutionListener.java | 1 + .../test/context/junit/jupiter/SpringExtension.java | 1 + .../AbstractDirtiesContextTestExecutionListener.java | 2 ++ .../test/context/support/ContextLoaderUtils.java | 1 + .../test/context/support/TestPropertySourceUtils.java | 1 + .../transaction/TransactionalTestExecutionListener.java | 2 ++ .../test/context/web/WebMergedContextConfiguration.java | 4 ++-- .../java/org/springframework/test/http/MediaTypeAssert.java | 1 + .../java/org/springframework/test/util/AssertionErrors.java | 6 ++++++ .../org/springframework/test/util/ReflectionTestUtils.java | 2 ++ .../org/springframework/test/web/ModelAndViewAssert.java | 3 ++- .../main/java/org/springframework/test/web/UriAssert.java | 1 + .../test/web/client/match/MockRestRequestMatchers.java | 4 +++- .../test/web/reactive/server/DefaultWebTestClient.java | 1 + .../test/web/reactive/server/WiretapConnector.java | 2 ++ .../springframework/test/web/servlet/DefaultMvcResult.java | 1 + .../web/servlet/assertj/DefaultAssertableMvcResult.java | 4 ++++ .../test/web/servlet/assertj/MvcResultAssert.java | 1 + .../test/web/servlet/result/StatusResultMatchers.java | 5 ++++- .../test/web/servlet/result/ViewResultMatchers.java | 2 ++ 27 files changed, 56 insertions(+), 10 deletions(-) diff --git a/gradle/spring-module.gradle b/gradle/spring-module.gradle index d096d5b23b..a6f4b94a20 100644 --- a/gradle/spring-module.gradle +++ b/gradle/spring-module.gradle @@ -120,8 +120,7 @@ tasks.withType(JavaCompile).configureEach { option("NullAway:AnnotatedPackages", "org.springframework") option("NullAway:UnannotatedSubPackages", "org.springframework.instrument,org.springframework.context.index," + "org.springframework.asm,org.springframework.cglib,org.springframework.objenesis," + - "org.springframework.javapoet,org.springframework.aot.nativex.substitution,org.springframework.aot.nativex.feature," + - "org.springframework.test,org.springframework.mock") + "org.springframework.javapoet,org.springframework.aot.nativex.substitution,org.springframework.aot.nativex.feature") } } tasks.compileJava { diff --git a/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java b/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java index dd52fe4025..7f7e0efcd2 100644 --- a/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java +++ b/spring-test/src/main/java/org/springframework/test/context/aot/TestContextAotGenerator.java @@ -352,6 +352,7 @@ public class TestContextAotGenerator { } catch (Exception ex) { Throwable cause = (ex instanceof ContextLoadException cle ? cle.getCause() : ex); + Assert.state(cause != null, "Cause must not be null"); throw new TestContextAotException( "Failed to load ApplicationContext for AOT processing for test class [%s]" .formatted(testClass.getName()), cause); diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java index 55148e6715..fdb004afc3 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java @@ -179,6 +179,7 @@ public class BeanOverrideBeanPostProcessor implements InstantiationAwareBeanPost registry.registerBeanDefinition(beanName, beanDefinition); Object override = overrideMetadata.createOverride(beanName, existingBeanDefinition, null); + Assert.state(this.beanFactory != null, "ConfigurableListableBeanFactory must not be null"); if (this.beanFactory.isSingleton(beanName)) { // Now we have an instance (the override) that we can register. // At this stage we don't expect a singleton instance to be present, @@ -222,6 +223,7 @@ public class BeanOverrideBeanPostProcessor implements InstantiationAwareBeanPost final OverrideMetadata metadata = this.earlyOverrideMetadata.get(beanName); if (metadata != null && metadata.getBeanOverrideStrategy() == BeanOverrideStrategy.WRAP_EARLY_BEAN) { bean = metadata.createOverride(beanName, null, bean); + Assert.state(this.beanFactory != null, "ConfigurableListableBeanFactory must not be null"); metadata.track(bean, this.beanFactory); } return bean; @@ -234,6 +236,7 @@ public class BeanOverrideBeanPostProcessor implements InstantiationAwareBeanPost } private Set getExistingBeanNames(ResolvableType resolvableType) { + Assert.state(this.beanFactory != null, "ConfigurableListableBeanFactory must not be null"); Set beans = new LinkedHashSet<>( Arrays.asList(this.beanFactory.getBeanNamesForType(resolvableType, true, false))); Class type = resolvableType.resolve(Object.class); @@ -274,6 +277,7 @@ public class BeanOverrideBeanPostProcessor implements InstantiationAwareBeanPost try { ReflectionUtils.makeAccessible(field); Object existingValue = ReflectionUtils.getField(field, target); + Assert.state(this.beanFactory != null, "ConfigurableListableBeanFactory must not be null"); Object bean = this.beanFactory.getBean(beanName, field.getType()); if (existingValue == bean) { return; @@ -308,7 +312,7 @@ public class BeanOverrideBeanPostProcessor implements InstantiationAwareBeanPost constructorArgs.addIndexedArgumentValue(0, new LinkedHashSet())); ConstructorArgumentValues.ValueHolder constructorArg = definition.getConstructorArgumentValues().getIndexedArgumentValue(0, Set.class); - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullAway"}) Set existing = (Set) constructorArg.getValue(); if (overrideMetadata != null && existing != null) { existing.addAll(overrideMetadata); diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizerFactory.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizerFactory.java index ff110f17b1..d2371de48d 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizerFactory.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizerFactory.java @@ -21,6 +21,7 @@ import java.util.Set; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.test.context.ContextConfigurationAttributes; import org.springframework.test.context.ContextCustomizer; import org.springframework.test.context.ContextCustomizerFactory; @@ -37,6 +38,7 @@ import org.springframework.test.context.TestContextAnnotationUtils; public class BeanOverrideContextCustomizerFactory implements ContextCustomizerFactory { @Override + @Nullable public ContextCustomizer createContextCustomizer(Class testClass, List configAttributes) { diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java index 2d852ef109..e8c4f15177 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java @@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.springframework.beans.BeanUtils; import org.springframework.core.ResolvableType; +import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotations; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; @@ -96,7 +97,9 @@ class BeanOverrideParser { BeanOverride beanOverride = mergedAnnotation.synthesize(); BeanOverrideProcessor processor = BeanUtils.instantiateClass(beanOverride.value()); - Annotation composedAnnotation = mergedAnnotation.getMetaSource().synthesize(); + MergedAnnotation metaSource = mergedAnnotation.getMetaSource(); + Assert.state(metaSource != null, "Meta-annotation source must not be null"); + Annotation composedAnnotation = metaSource.synthesize(); ResolvableType typeToOverride = processor.getOrDeduceType(field, composedAnnotation, source); Assert.state(overrideAnnotationFound.compareAndSet(false, true), diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java index 24fb55f6cb..d77e50b269 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java @@ -75,7 +75,7 @@ class MockDefinition extends Definition { } @Override - protected Object createOverride(String beanName, BeanDefinition existingBeanDefinition, Object existingBeanInstance) { + protected Object createOverride(String beanName, @Nullable BeanDefinition existingBeanDefinition, @Nullable Object existingBeanInstance) { return createMock(beanName); } diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoResetTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoResetTestExecutionListener.java index 5424b896c6..e96107d3c6 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoResetTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoResetTestExecutionListener.java @@ -31,6 +31,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.NativeDetector; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.test.context.TestContext; import org.springframework.test.context.support.AbstractTestExecutionListener; @@ -101,6 +102,7 @@ public class MockitoResetTestExecutionListener extends AbstractTestExecutionList } } + @Nullable private Object getBean(ConfigurableListableBeanFactory beanFactory, String name) { try { if (isStandardBeanOrSingletonFactoryBean(beanFactory, name)) { diff --git a/spring-test/src/main/java/org/springframework/test/context/jdbc/SqlScriptsTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/jdbc/SqlScriptsTestExecutionListener.java index f219bea1f7..570eaec4dc 100644 --- a/spring-test/src/main/java/org/springframework/test/context/jdbc/SqlScriptsTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/jdbc/SqlScriptsTestExecutionListener.java @@ -412,6 +412,7 @@ public class SqlScriptsTestExecutionListener extends AbstractTestExecutionListen * Detect a default SQL script by implementing the algorithm defined in * {@link Sql#scripts}. */ + @SuppressWarnings("NullAway") private String detectDefaultScript(Class testClass, @Nullable Method testMethod, boolean classLevel) { Assert.state(classLevel || testMethod != null, "Method-level @Sql requires a testMethod"); diff --git a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/SpringExtension.java b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/SpringExtension.java index 74477bfe13..efc6d139a9 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/SpringExtension.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/SpringExtension.java @@ -377,6 +377,7 @@ public class SpringExtension implements BeforeAllCallback, AfterAllCallback, Tes * the supplied {@link TestContextManager}. * @since 6.1 */ + @SuppressWarnings("NullAway") private static void registerMethodInvoker(TestContextManager testContextManager, ExtensionContext context) { testContextManager.getTestContext().setMethodInvoker(context.getExecutableInvoker()::invoke); } diff --git a/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java index 7697565cfd..084d6ae7ff 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java @@ -84,6 +84,7 @@ public abstract class AbstractDirtiesContextTestExecutionListener extends Abstra * @since 4.2 * @see #dirtyContext */ + @SuppressWarnings("NullAway") protected void beforeOrAfterTestMethod(TestContext testContext, MethodMode requiredMethodMode, ClassMode requiredClassMode) throws Exception { @@ -135,6 +136,7 @@ public abstract class AbstractDirtiesContextTestExecutionListener extends Abstra * @since 4.2 * @see #dirtyContext */ + @SuppressWarnings("NullAway") protected void beforeOrAfterTestClass(TestContext testContext, ClassMode requiredClassMode) throws Exception { Assert.notNull(testContext, "TestContext must not be null"); Assert.notNull(requiredClassMode, "requiredClassMode must not be null"); diff --git a/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java b/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java index 96bcce7623..d768a8cfaf 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/ContextLoaderUtils.java @@ -232,6 +232,7 @@ abstract class ContextLoaderUtils { * @throws IllegalArgumentException if the supplied class is {@code null} or if * {@code @ContextConfiguration} is not present on the supplied class */ + @SuppressWarnings("NullAway") static List resolveContextConfigurationAttributes(Class testClass) { Assert.notNull(testClass, "Class must not be null"); diff --git a/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceUtils.java b/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceUtils.java index 2e1c9d8338..a37261b71b 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceUtils.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceUtils.java @@ -135,6 +135,7 @@ public abstract class TestPropertySourceUtils { return mergedAttributes; } + @SuppressWarnings("NullAway") private static boolean duplicationDetected(TestPropertySourceAttributes currentAttributes, @Nullable TestPropertySourceAttributes previousAttributes) { diff --git a/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java index 0114800545..32921943ee 100644 --- a/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java @@ -196,6 +196,7 @@ public class TransactionalTestExecutionListener extends AbstractTestExecutionLis * @see #getTransactionManager(TestContext, String) */ @Override + @SuppressWarnings("NullAway") public void beforeTestMethod(final TestContext testContext) throws Exception { Method testMethod = testContext.getTestMethod(); Class testClass = testContext.getTestClass(); @@ -414,6 +415,7 @@ public class TransactionalTestExecutionListener extends AbstractTestExecutionLis * @return the default rollback flag for the supplied test context * @throws Exception if an error occurs while determining the default rollback flag */ + @SuppressWarnings("NullAway") protected final boolean isDefaultRollback(TestContext testContext) throws Exception { Class testClass = testContext.getTestClass(); Rollback rollback = TestContextAnnotationUtils.findMergedAnnotation(testClass, Rollback.class); diff --git a/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java b/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java index 274af31041..79c948a30b 100644 --- a/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java +++ b/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java @@ -218,8 +218,8 @@ public class WebMergedContextConfiguration extends MergedContextConfiguration { */ @Override public boolean equals(@Nullable Object other) { - return (this == other || (super.equals(other) && - this.resourceBasePath.equals(((WebMergedContextConfiguration) other).resourceBasePath))); + return (this == other || (super.equals(other) && other instanceof WebMergedContextConfiguration otherConfiguration && + this.resourceBasePath.equals(otherConfiguration.resourceBasePath))); } /** diff --git a/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java b/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java index 73e8e89397..6f002c8f6d 100644 --- a/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java +++ b/spring-test/src/main/java/org/springframework/test/http/MediaTypeAssert.java @@ -91,6 +91,7 @@ public class MediaTypeAssert extends AbstractObjectAssert fail") public static void fail(String message) { throw new AssertionError(message); } @@ -65,6 +67,7 @@ public abstract class AssertionErrors { * @param message a message that describes the reason for the failure * @param condition the condition to test for */ + @Contract("_, false -> fail") public static void assertTrue(String message, boolean condition) { if (!condition) { fail(message); @@ -78,6 +81,7 @@ public abstract class AssertionErrors { * @param condition the condition to test for * @since 5.2.1 */ + @Contract("_, true -> fail") public static void assertFalse(String message, boolean condition) { if (condition) { fail(message); @@ -91,6 +95,7 @@ public abstract class AssertionErrors { * @param object the object to check * @since 5.2.1 */ + @Contract("_, !null -> fail") public static void assertNull(String message, @Nullable Object object) { assertTrue(message, object == null); } @@ -102,6 +107,7 @@ public abstract class AssertionErrors { * @param object the object to check * @since 5.1.8 */ + @Contract("_, null -> fail") public static void assertNotNull(String message, @Nullable Object object) { assertTrue(message, object != null); } diff --git a/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java b/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java index 419374b957..e17d334022 100644 --- a/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java +++ b/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java @@ -172,6 +172,7 @@ public abstract class ReflectionTestUtils { * @see ReflectionUtils#setField(Field, Object, Object) * @see AopTestUtils#getUltimateTargetObject(Object) */ + @SuppressWarnings("NullAway") public static void setField(@Nullable Object targetObject, @Nullable Class targetClass, @Nullable String name, @Nullable Object value, @Nullable Class type) { @@ -259,6 +260,7 @@ public abstract class ReflectionTestUtils { * @see AopTestUtils#getUltimateTargetObject(Object) */ @Nullable + @SuppressWarnings("NullAway") public static Object getField(@Nullable Object targetObject, @Nullable Class targetClass, String name) { Assert.isTrue(targetObject != null || targetClass != null, "Either targetObject or targetClass for the field must be specified"); diff --git a/spring-test/src/main/java/org/springframework/test/web/ModelAndViewAssert.java b/spring-test/src/main/java/org/springframework/test/web/ModelAndViewAssert.java index 02653350eb..0d87fdfe25 100644 --- a/spring-test/src/main/java/org/springframework/test/web/ModelAndViewAssert.java +++ b/spring-test/src/main/java/org/springframework/test/web/ModelAndViewAssert.java @@ -53,7 +53,7 @@ public abstract class ModelAndViewAssert { * @param expectedType expected type of the model value * @return the model value */ - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullAway"}) public static T assertAndReturnModelAttributeOfType(ModelAndView mav, String modelName, Class expectedType) { Map model = mav.getModel(); Object obj = model.get(modelName); @@ -109,6 +109,7 @@ public abstract class ModelAndViewAssert { * @param mav the ModelAndView to test against (never {@code null}) * @param expectedModel the expected model */ + @SuppressWarnings("NullAway") public static void assertModelAttributeValues(ModelAndView mav, Map expectedModel) { Map model = mav.getModel(); diff --git a/spring-test/src/main/java/org/springframework/test/web/UriAssert.java b/spring-test/src/main/java/org/springframework/test/web/UriAssert.java index 1a278591ec..7fac1976fb 100644 --- a/spring-test/src/main/java/org/springframework/test/web/UriAssert.java +++ b/spring-test/src/main/java/org/springframework/test/web/UriAssert.java @@ -80,6 +80,7 @@ public class UriAssert extends AbstractStringAssert { return this; } + @SuppressWarnings("NullAway") private String buildUri(String uriTemplate, Object... uriVars) { try { return UriComponentsBuilder.fromUriString(uriTemplate) diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java index efa97c2719..203b4a8538 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java @@ -158,6 +158,7 @@ public abstract class MockRestRequestMatchers { * @see #queryParam(String, String...) */ @SafeVarargs + @SuppressWarnings("NullAway") public static RequestMatcher queryParam(String name, Matcher... matchers) { return request -> { MultiValueMap params = getQueryParams(request); @@ -185,6 +186,7 @@ public abstract class MockRestRequestMatchers { * @see #queryParamList(String, Matcher) * @see #queryParam(String, Matcher...) */ + @SuppressWarnings("NullAway") public static RequestMatcher queryParam(String name, String... expectedValues) { return request -> { MultiValueMap params = getQueryParams(request); @@ -362,7 +364,7 @@ public abstract class MockRestRequestMatchers { if (values == null) { fail(message + " to exist but was null"); } - if (count > values.size()) { + else if (count > values.size()) { fail(message + " to have at least <" + count + "> values but found " + values); } } diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java index da784ae0fa..152a207855 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java @@ -374,6 +374,7 @@ class DefaultWebTestClient implements WebTestClient { DefaultWebTestClient.this.entityResultConsumer, getResponseTimeout()); } + @SuppressWarnings("NullAway") private ClientRequest.Builder initRequestBuilder() { return ClientRequest.create(this.httpMethod, initUri()) .headers(headersToUse -> { diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java index 1c5d91caea..35e2eee74a 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java @@ -62,6 +62,7 @@ class WiretapConnector implements ClientHttpConnector { @Override + @SuppressWarnings("NullAway") public Mono connect(HttpMethod method, URI uri, Function> requestCallback) { @@ -181,6 +182,7 @@ class WiretapConnector implements ClientHttpConnector { return this.publisherNested; } + @SuppressWarnings("NullAway") public Mono getContent() { return Mono.defer(() -> { if (this.content.scan(Scannable.Attr.TERMINATED) == Boolean.TRUE) { diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java b/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java index 02db2d58fb..5582235cfb 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/DefaultMvcResult.java @@ -137,6 +137,7 @@ class DefaultMvcResult implements MvcResult { } @Override + @SuppressWarnings("NullAway") public Object getAsyncResult(long timeToWait) { if (this.mockRequest.getAsyncContext() != null && timeToWait == -1) { long requestTimeout = this.mockRequest.getAsyncContext().getTimeout(); diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/DefaultAssertableMvcResult.java b/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/DefaultAssertableMvcResult.java index 3864688c9d..83f4037c3a 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/DefaultAssertableMvcResult.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/DefaultAssertableMvcResult.java @@ -68,21 +68,25 @@ final class DefaultAssertableMvcResult implements AssertableMvcResult { } @Override + @Nullable public Object getHandler() { return getTarget().getHandler(); } @Override + @Nullable public HandlerInterceptor[] getInterceptors() { return getTarget().getInterceptors(); } @Override + @Nullable public ModelAndView getModelAndView() { return getTarget().getModelAndView(); } @Override + @Nullable public Exception getResolvedException() { return getTarget().getResolvedException(); } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/MvcResultAssert.java b/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/MvcResultAssert.java index 63bffc3014..e4e666546f 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/MvcResultAssert.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/assertj/MvcResultAssert.java @@ -203,6 +203,7 @@ public class MvcResultAssert extends AbstractMockHttpServletResponseAssert matcher) { return result -> { ModelAndView mav = result.getModelAndView(); @@ -60,6 +61,7 @@ public class ViewResultMatchers { /** * Assert the selected view name. */ + @SuppressWarnings("NullAway") public ResultMatcher name(String expectedViewName) { return result -> { ModelAndView mav = result.getModelAndView();