diff --git a/testing-modules/mockito-4/pom.xml b/testing-modules/mockito-4/pom.xml
index 519724f3b824..81fe2a6882c4 100644
--- a/testing-modules/mockito-4/pom.xml
+++ b/testing-modules/mockito-4/pom.xml
@@ -3,6 +3,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+
com.baeldung
parent-modules
@@ -17,17 +18,48 @@
23
UTF-8
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.10.0
+ test
+
+
+
+ org.mockito
+ mockito-core
+ 5.11.0
+ test
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
+
org.apache.maven.plugins
maven-compiler-plugin
+ 3.11.0
21
21
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.2.5
+
-
\ 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..f39233ade0f3
--- /dev/null
+++ b/testing-modules/mockito-4/src/test/java/com/baeldung/mockingobjectproperties/MockingObjectPropertiesUnitTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.mockingobjectproperties;
+
+import static org.mockito.Mockito.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import org.junit.jupiter.api.Test;
+
+public class MockingObjectPropertiesUnitTest {
+
+ @Test
+ void givenMockRequest_whenSimulatingDynamicAttributes_thenBehavesLikeRealObject() {
+ HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+ Map attributes = new HashMap<>();
+
+ // Simulate internal state for getAttribute()
+ when(mockRequest.getAttribute(anyString()))
+ .thenAnswer(invocation -> attributes.get(invocation.getArgument(0)));
+
+ // Intercept setAttribute() calls to store values
+ doAnswer(invocation -> {
+ attributes.put(invocation.getArgument(0), invocation.getArgument(1));
+ return null;
+ }).when(mockRequest).setAttribute(anyString(), any());
+
+ // Use the main class
+ MockingObjectProperties helper = new MockingObjectProperties();
+
+ // Set and get attribute
+ mockRequest.setAttribute("search", "Mockito Example");
+ Object value = helper.getSearchAttribute(mockRequest);
+
+ // Assert the value is correctly retrieved
+ assertEquals("Mockito Example", value);
+
+ // Verify interactions
+ verify(mockRequest).setAttribute("search", "Mockito Example");
+ verify(mockRequest).getAttribute("search");
+ verify(mockRequest, never()).getAttribute("nonexistent");
+ }
+}