diff --git a/testing-modules/mockito-4/pom.xml b/testing-modules/mockito-4/pom.xml
index 519724f3b824..0b624a19a12d 100644
--- a/testing-modules/mockito-4/pom.xml
+++ b/testing-modules/mockito-4/pom.xml
@@ -13,8 +13,9 @@
mockito-4
- 23
- 23
+ 21
+ ${java.version}
+ ${java.version}
UTF-8
@@ -23,11 +24,11 @@
org.apache.maven.plugins
maven-compiler-plugin
- 21
- 21
+ ${java.version}
+ ${java.version}
-
\ No newline at end of file
+
diff --git a/testing-modules/mockito-4/src/main/java/com/baeldung/mockingobjectproperties/MockingObjectProperties.java b/testing-modules/mockito-4/src/main/java/com/baeldung/mockingobjectproperties/MockingObjectProperties.java
new file mode 100644
index 000000000000..0a77dbc0c6b8
--- /dev/null
+++ b/testing-modules/mockito-4/src/main/java/com/baeldung/mockingobjectproperties/MockingObjectProperties.java
@@ -0,0 +1,15 @@
+package com.baeldung.mockingobjectproperties;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class MockingObjectProperties {
+
+ public Object getSearchAttribute(HttpServletRequest request) {
+ return request.getAttribute("search");
+ }
+
+ public void printSearchAttribute(HttpServletRequest request) {
+ Object value = getSearchAttribute(request);
+ System.out.println("Search attribute: " + value);
+ }
+}
diff --git a/testing-modules/mockito-4/src/test/java/com/baeldung/mockingobjectproperties/MockingObjectPropertiesUnitTest.java b/testing-modules/mockito-4/src/test/java/com/baeldung/mockingobjectproperties/MockingObjectPropertiesUnitTest.java
new file mode 100644
index 000000000000..b038a29ce338
--- /dev/null
+++ b/testing-modules/mockito-4/src/test/java/com/baeldung/mockingobjectproperties/MockingObjectPropertiesUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.mockingobjectproperties;
+
+import org.junit.jupiter.api.Test;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.any;
+
+public class MockingObjectPropertiesUnitTest {
+
+ @Test
+ void givenMockRequest_whenUsedWithoutStubbing_thenReturnsNull() {
+ HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+ mockRequest.setAttribute("search", "Mockito Example");
+
+ MockingObjectProperties helper = new MockingObjectProperties();
+ Object value = helper.getSearchAttribute(mockRequest);
+
+ assertNull(value, "Expected null because mock does not retain state");
+ }
+
+ @Test
+ void givenMockRequest_whenStubbedProperly_thenReturnsExpectedValue() {
+ HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+ when(mockRequest.getAttribute("search"))
+ .thenReturn("Mockito Example");
+
+ MockingObjectProperties helper = new MockingObjectProperties();
+ Object value = helper.getSearchAttribute(mockRequest);
+
+ assertEquals("Mockito Example", value);
+ }
+
+ @Test
+ void givenMockRequest_whenSimulatingDynamicAttributes_thenBehavesLikeRealObject() {
+ HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+ Map attributes = new HashMap<>();
+
+ when(mockRequest.getAttribute(anyString()))
+ .thenAnswer(invocation -> attributes.get(invocation.getArgument(0)));
+
+ doAnswer(invocation -> {
+ attributes.put(invocation.getArgument(0), invocation.getArgument(1));
+ return null;
+ }).when(mockRequest).setAttribute(anyString(), any());
+
+ MockingObjectProperties helper = new MockingObjectProperties();
+
+ mockRequest.setAttribute("search", "Mockito Example");
+ Object value = helper.getSearchAttribute(mockRequest);
+
+ assertEquals("Mockito Example", value);
+ }
+
+ @Test
+ void givenMockRequest_whenVerifyingInteractions_thenWorksAsExpected() {
+ HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+
+ mockRequest.setAttribute("search", "Mockito Example");
+ mockRequest.getAttribute("search");
+
+ verify(mockRequest)
+ .setAttribute("search", "Mockito Example");
+ verify(mockRequest)
+ .getAttribute("search");
+ verify(mockRequest, never())
+ .getAttribute("nonexistent");
+ }
+}