From 358a061997a4b853e3215dea0217a070f0e391e4 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Sat, 5 Nov 2022 10:13:10 +0530 Subject: [PATCH] BAEL-5777 - Mocking a singleton with Mockito --- testing-modules/testing-libraries-2/pom.xml | 7 ++++ .../com/baeldung/singleton/CacheManager.java | 29 +++++++++++++ .../java/com/baeldung/singleton/Product.java | 27 ++++++++++++ .../com/baeldung/singleton/ProductDAO.java | 8 ++++ .../baeldung/singleton/ProductService.java | 26 ++++++++++++ .../singleton/ProductServiceTest.java | 41 +++++++++++++++++++ .../org.mockito.plugins.MockMaker | 1 + 7 files changed, 139 insertions(+) create mode 100644 testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/CacheManager.java create mode 100644 testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/Product.java create mode 100644 testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductDAO.java create mode 100644 testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductService.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/singleton/ProductServiceTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/testing-modules/testing-libraries-2/pom.xml b/testing-modules/testing-libraries-2/pom.xml index b0680c1e40..f7f4d140e6 100644 --- a/testing-modules/testing-libraries-2/pom.xml +++ b/testing-modules/testing-libraries-2/pom.xml @@ -53,6 +53,12 @@ ${system-stubs.version} test + + org.mockito + mockito-inline + ${mockito-inline.version} + test + @@ -103,6 +109,7 @@ + 4.8.0 0.8.6 1.19.0 1.0.0 diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/CacheManager.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/CacheManager.java new file mode 100644 index 0000000000..51aea926b4 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/CacheManager.java @@ -0,0 +1,29 @@ +package com.baeldung.singleton; + +import java.util.HashMap; + +public class CacheManager { + private final HashMap map; + + private static CacheManager instance; + + private CacheManager() { + map = new HashMap<>(); + } + + public static CacheManager getInstance() { + if(instance == null) { + instance = new CacheManager(); + } + + return instance; + } + + public T getValue(String key, Class clazz) { + return clazz.cast(map.get(key)); + } + + public Object setValue(String key, Object value) { + return map.put(key, value); + } +} \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/Product.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/Product.java new file mode 100644 index 0000000000..58905e3488 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/Product.java @@ -0,0 +1,27 @@ +package com.baeldung.singleton; + +public class Product { + private String name; + private String description; + + public Product(String name, String description) { + this.name = name; + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductDAO.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductDAO.java new file mode 100644 index 0000000000..ae9562561b --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductDAO.java @@ -0,0 +1,8 @@ +package com.baeldung.singleton; + +public class ProductDAO { + public Product getProduct(String productName) { + + return new Product(productName, "description"); + } +} diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductService.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductService.java new file mode 100644 index 0000000000..382087d96d --- /dev/null +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/singleton/ProductService.java @@ -0,0 +1,26 @@ +package com.baeldung.singleton; + +public class ProductService { + + private final ProductDAO productDAO; + private final CacheManager cacheManager; + + public ProductService(ProductDAO productDAO) { + this.productDAO = productDAO; + this.cacheManager = CacheManager.getInstance(); + } + + public ProductService(ProductDAO productDAO, CacheManager cacheManager) { + this.productDAO = productDAO; + this.cacheManager = cacheManager; + } + + public Product getProduct(String productName) { + Product product = cacheManager.getValue(productName, Product.class); + if (product == null) { + product = productDAO.getProduct(productName); + } + + return product; + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/singleton/ProductServiceTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/singleton/ProductServiceTest.java new file mode 100644 index 0000000000..438a4784ec --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/singleton/ProductServiceTest.java @@ -0,0 +1,41 @@ +package com.baeldung.singleton; + +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +class ProductServiceTest { + + @Test + void givenValueExistsInCache_whenGetProduct_thenDAOIsNotCalled() { + ProductDAO productDAO = mock(ProductDAO.class); + CacheManager cacheManager = mock(CacheManager.class); + Product product = new Product("product1", "description"); + ProductService productService = new ProductService(productDAO, cacheManager); + + when(cacheManager.getValue(any(), any())).thenReturn(product); + + productService.getProduct("product1"); + + Mockito.verify(productDAO, times(0)).getProduct(any()); + } + + @Test + void givenValueExistsInCache_whenGetProduct_thenDAOIsNotCalled_mockingStatic() { + ProductDAO productDAO = mock(ProductDAO.class); + CacheManager cacheManager = mock(CacheManager.class); + Product product = new Product("product1", "description"); + + try (MockedStatic cacheManagerMock = mockStatic(CacheManager.class)) { + cacheManagerMock.when(CacheManager::getInstance).thenReturn(cacheManager); + when(cacheManager.getValue(any(), any())).thenReturn(product); + ProductService productService = new ProductService(productDAO); + productService.getProduct("product1"); + Mockito.verify(productDAO, times(0)).getProduct(any()); + } + } +} \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/testing-modules/testing-libraries-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 0000000000..ca6ee9cea8 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline \ No newline at end of file