From 7ee18f388c63fff385c8fd2e62afba48339d1eef Mon Sep 17 00:00:00 2001 From: mperor Date: Tue, 7 Jan 2025 19:45:09 +0100 Subject: [PATCH 1/2] Update test utility --- Common/src/main/java/pl/mperor/lab/common/TestUtils.java | 4 ++++ .../lab/common/{UtilsTest.java => ReadableOutputTest.java} | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) rename Common/src/test/java/pl/mperor/lab/common/{UtilsTest.java => ReadableOutputTest.java} (97%) diff --git a/Common/src/main/java/pl/mperor/lab/common/TestUtils.java b/Common/src/main/java/pl/mperor/lab/common/TestUtils.java index 2929c8c..83f071a 100644 --- a/Common/src/main/java/pl/mperor/lab/common/TestUtils.java +++ b/Common/src/main/java/pl/mperor/lab/common/TestUtils.java @@ -47,6 +47,10 @@ default E getThird() { return getNext(2); } + default E getForth() { + return getNext(3); + } + private E getNext(int index) { if (this.isEmpty() && index >= size()) { throw new NoSuchElementException(); diff --git a/Common/src/test/java/pl/mperor/lab/common/UtilsTest.java b/Common/src/test/java/pl/mperor/lab/common/ReadableOutputTest.java similarity index 97% rename from Common/src/test/java/pl/mperor/lab/common/UtilsTest.java rename to Common/src/test/java/pl/mperor/lab/common/ReadableOutputTest.java index 1d4f2ec..349de94 100644 --- a/Common/src/test/java/pl/mperor/lab/common/UtilsTest.java +++ b/Common/src/test/java/pl/mperor/lab/common/ReadableOutputTest.java @@ -6,7 +6,7 @@ import java.util.NoSuchElementException; import java.util.stream.Stream; -class UtilsTest { +class ReadableOutputTest { @Test public void testReadableOutputReturnsReadableList() { From d67476da0c0af966baacb99dfd79d2b58ae87451 Mon Sep 17 00:00:00 2001 From: mperor Date: Tue, 7 Jan 2025 19:49:26 +0100 Subject: [PATCH 2/2] Add proxy example with test --- .../structural/proxy/ExecutableService.java | 5 ++++ .../pattern/structural/proxy/ServiceImpl.java | 13 +++++++++ .../structural/proxy/ServiceProvider.java | 13 +++++++++ .../structural/proxy/ServiceProxy.java | 20 ++++++++++++++ .../structural/proxy/ServiceProviderTest.java | 27 +++++++++++++++++++ 5 files changed, 78 insertions(+) create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ExecutableService.java create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceImpl.java create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProvider.java create mode 100644 DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProxy.java create mode 100644 DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProviderTest.java diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ExecutableService.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ExecutableService.java new file mode 100644 index 0000000..84ac36f --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ExecutableService.java @@ -0,0 +1,5 @@ +package pl.mperor.lab.java.design.pattern.structural.proxy; + +public interface ExecutableService { + void execute(); +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceImpl.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceImpl.java new file mode 100644 index 0000000..1393c5b --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceImpl.java @@ -0,0 +1,13 @@ +package pl.mperor.lab.java.design.pattern.structural.proxy; + +class ServiceImpl implements ExecutableService { + + ServiceImpl() { + System.out.println("Service has been initialized!"); + } + + @Override + public void execute() { + System.out.println("Method has been executed!"); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProvider.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProvider.java new file mode 100644 index 0000000..a202b12 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProvider.java @@ -0,0 +1,13 @@ +package pl.mperor.lab.java.design.pattern.structural.proxy; + +import java.util.function.Supplier; + +public enum ServiceProvider implements Supplier { + INSTANCE; + + @Override + public ExecutableService get() { + return new ServiceProxy(); + } + +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProxy.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProxy.java new file mode 100644 index 0000000..5ca63fd --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProxy.java @@ -0,0 +1,20 @@ +package pl.mperor.lab.java.design.pattern.structural.proxy; + +class ServiceProxy implements ExecutableService { + + private ExecutableService service; + + @Override + public void execute() { + System.out.println("Before executing service method!"); + lazyLoadingService(); + service.execute(); + System.out.println("After executing service method!"); + } + + private void lazyLoadingService() { + if (service == null) { + service = new ServiceImpl(); + } + } +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProviderTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProviderTest.java new file mode 100644 index 0000000..d102ceb --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/proxy/ServiceProviderTest.java @@ -0,0 +1,27 @@ +package pl.mperor.lab.java.design.pattern.structural.proxy; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.platform.commons.util.StringUtils; +import pl.mperor.lab.common.TestUtils; + +public class ServiceProviderTest { + + @Test + public void testServiceUsingProxyUnderneath() { + var out = TestUtils.setTempSystemOut(); + var service = ServiceProvider.INSTANCE.get(); + Assertions.assertTrue(StringUtils.isBlank(out.all()), + "Lazy loading service should not be initialized!"); + Assertions.assertInstanceOf(ServiceProxy.class, service); + + service.execute(); + var outLines = out.lines(); + Assertions.assertEquals(outLines.getFirst(), "Before executing service method!"); + Assertions.assertEquals(outLines.getSecond(), "Service has been initialized!"); + Assertions.assertEquals(outLines.getThird(), "Method has been executed!"); + Assertions.assertEquals(outLines.getForth(), "After executing service method!"); + TestUtils.resetSystemOut(); + } + +}