diff --git a/patterns-modules/design-patterns-creational-2/pom.xml b/patterns-modules/design-patterns-creational-2/pom.xml
index fe79052a99..27c83c9eb7 100644
--- a/patterns-modules/design-patterns-creational-2/pom.xml
+++ b/patterns-modules/design-patterns-creational-2/pom.xml
@@ -12,4 +12,13 @@
1.0.0-SNAPSHOT
+
+
+ org.mockito
+ mockito-inline
+ ${mockito.version}
+ test
+
+
+
\ No newline at end of file
diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/Logger.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/Logger.java
new file mode 100644
index 0000000000..31729c29f4
--- /dev/null
+++ b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/Logger.java
@@ -0,0 +1,38 @@
+package com.baeldung.singleton;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.time.LocalDateTime;
+
+public class Logger {
+ private static volatile Logger instance;
+
+ private PrintWriter fileWriter;
+
+ public static Logger getInstance() {
+ if (instance == null) {
+ synchronized (Logger.class) {
+ if (instance == null) {
+ instance = new Logger();
+ }
+ }
+ }
+ return instance;
+ }
+
+ private Logger() {
+ try {
+ fileWriter = new PrintWriter(new FileWriter("app.log"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void log(String message) {
+ String log = String.format("[%s]- %s", LocalDateTime.now(), message);
+ fileWriter.println(log);
+ fileWriter.flush();
+ }
+
+}
\ No newline at end of file
diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/SingletonDemo.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/SingletonDemo.java
new file mode 100644
index 0000000000..2ebd6c8ad4
--- /dev/null
+++ b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/SingletonDemo.java
@@ -0,0 +1,12 @@
+package com.baeldung.singleton;
+
+public class SingletonDemo {
+
+ public int sum(int a, int b) {
+ int result = a + b;
+ Logger logger = Logger.getInstance();
+ logger.log("The sum is " + result);
+ return result;
+ }
+
+}
\ No newline at end of file
diff --git a/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/singleton/SingletonUnitTest.java b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/singleton/SingletonUnitTest.java
new file mode 100644
index 0000000000..d4154d9396
--- /dev/null
+++ b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/singleton/SingletonUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.singleton;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+
+class SingletonUnitTest {
+
+ @Test
+ void givenTwoValues_whenSum_thenReturnCorrectResult() {
+ SingletonDemo singletonDemo = new SingletonDemo();
+ int result = singletonDemo.sum(12, 4);
+ Assertions.assertEquals(16, result);
+ }
+
+ @Test
+ void givenMockedLogger_whenSum_thenReturnCorrectResult() {
+ Logger logger = mock(Logger.class);
+
+ try (MockedStatic loggerMockedStatic = mockStatic(Logger.class)) {
+ loggerMockedStatic.when(Logger::getInstance).thenReturn(logger);
+ doNothing().when(logger).log(any());
+
+ SingletonDemo singletonDemo = new SingletonDemo();
+ int result = singletonDemo.sum(12, 4);
+ Assertions.assertEquals(16, result);
+ }
+ }
+
+}