From 1add21c1fe69cae43dfa66c1913d146377a4ddd5 Mon Sep 17 00:00:00 2001 From: yashasvi Date: Sat, 11 Sep 2021 13:18:48 +0545 Subject: [PATCH] Hexagonal Architecture in Java --- .../controller/FurnitureController.java | 37 ++++++++++ .../domain/model/Furniture.java | 43 +++++++++++ .../domain/services/FurnitureService.java | 16 +++++ .../domain/services/FurnitureServiceImpl.java | 32 +++++++++ .../persistance/FurnitureRepository.java | 14 ++++ .../persistance/FurnitureRepositoryImpl.java | 27 +++++++ .../FurnitureServiceImplUnitTest.java | 71 +++++++++++++++++++ 7 files changed, 240 insertions(+) create mode 100644 patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/controller/FurnitureController.java create mode 100644 patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/model/Furniture.java create mode 100644 patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureService.java create mode 100644 patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureServiceImpl.java create mode 100644 patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepository.java create mode 100644 patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepositoryImpl.java create mode 100644 patterns/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/FurnitureServiceImplUnitTest.java diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/controller/FurnitureController.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/controller/FurnitureController.java new file mode 100644 index 0000000000..850960b883 --- /dev/null +++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/controller/FurnitureController.java @@ -0,0 +1,37 @@ +package com.baeldung.pattern.simplehexagonalexample.controller; + +import com.baeldung.pattern.simplehexagonalexample.domain.model.Furniture; +import com.baeldung.pattern.simplehexagonalexample.domain.services.FurnitureService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/furniture") +public class FurnitureController { + + @Autowired + private FurnitureService furnitureService; + + @PostMapping + public void manufactureFurniture(@RequestBody Furniture furniture) { + furnitureService.manufactureFurniture(furniture); + } + + @GetMapping(path = "/{name}") + public Furniture getFurniture(@PathVariable String name) { + return furnitureService.getFurniture(name); + } + + @GetMapping + public List listFurniture() { + return furnitureService.listAllFurniture(); + } +} + diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/model/Furniture.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/model/Furniture.java new file mode 100644 index 0000000000..e4f29ac872 --- /dev/null +++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/model/Furniture.java @@ -0,0 +1,43 @@ +package com.baeldung.pattern.simplehexagonalexample.domain.model; + +import java.io.Serializable; + +public class Furniture implements Serializable { + + private String name; + private String color; + private int length; + private int breadth; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getBreadth() { + return breadth; + } + + public void setBreadth(int breadth) { + this.breadth = breadth; + } +} diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureService.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureService.java new file mode 100644 index 0000000000..0c780dd36b --- /dev/null +++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureService.java @@ -0,0 +1,16 @@ +package com.baeldung.pattern.simplehexagonalexample.domain.services; + +import com.baeldung.pattern.simplehexagonalexample.domain.model.Furniture; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public interface FurnitureService { + + Furniture manufactureFurniture(Furniture furniture); + + Furniture getFurniture(String name); + + List listAllFurniture(); +} diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureServiceImpl.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureServiceImpl.java new file mode 100644 index 0000000000..f7f83b512f --- /dev/null +++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/domain/services/FurnitureServiceImpl.java @@ -0,0 +1,32 @@ +package com.baeldung.pattern.simplehexagonalexample.domain.services; + +import com.baeldung.pattern.simplehexagonalexample.domain.model.Furniture; +import com.baeldung.pattern.simplehexagonalexample.persistance.FurnitureRepository; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +public class FurnitureServiceImpl implements FurnitureService { + + private final FurnitureRepository furnitureRepository; + + @Autowired + public FurnitureServiceImpl(FurnitureRepository furnitureRepository) { + this.furnitureRepository = furnitureRepository; + } + + @Override + public Furniture manufactureFurniture(Furniture furniture) { + return furnitureRepository.manufactureFurniture(furniture); + } + + @Override + public Furniture getFurniture(String name) { + return furnitureRepository.getFurniture(name); + } + + @Override + public List listAllFurniture() { + return furnitureRepository.listAllFurniture(); + } +} diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepository.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepository.java new file mode 100644 index 0000000000..6cbd3e9827 --- /dev/null +++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.pattern.simplehexagonalexample.persistance; + +import com.baeldung.pattern.simplehexagonalexample.domain.model.Furniture; + +import java.util.List; + +public interface FurnitureRepository { + + Furniture manufactureFurniture(Furniture furniture); + + Furniture getFurniture(String name); + + List listAllFurniture(); +} diff --git a/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepositoryImpl.java b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepositoryImpl.java new file mode 100644 index 0000000000..7be25f3c5e --- /dev/null +++ b/patterns/hexagonal-architecture/src/main/java/com/baeldung/pattern/simplehexagonalexample/persistance/FurnitureRepositoryImpl.java @@ -0,0 +1,27 @@ +package com.baeldung.pattern.simplehexagonalexample.persistance; + +import com.baeldung.pattern.simplehexagonalexample.domain.model.Furniture; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FurnitureRepositoryImpl implements FurnitureRepository { + + private final Map furnitureStore = new HashMap<>(); + + @Override + public Furniture manufactureFurniture(Furniture furniture) { + return furnitureStore.put(furniture.getName(), furniture); + } + + @Override + public Furniture getFurniture(String name) { + return furnitureStore.get(name); + } + + @Override + public List listAllFurniture() { + return null; + } +} diff --git a/patterns/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/FurnitureServiceImplUnitTest.java b/patterns/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/FurnitureServiceImplUnitTest.java new file mode 100644 index 0000000000..ebda4de0d5 --- /dev/null +++ b/patterns/hexagonal-architecture/src/test/java/com/baeldung/pattern/hexagonal/domain/services/FurnitureServiceImplUnitTest.java @@ -0,0 +1,71 @@ +package com.baeldung.pattern.hexagonal.domain.services; + +import com.baeldung.pattern.simplehexagonalexample.domain.model.Furniture; +import com.baeldung.pattern.simplehexagonalexample.domain.services.FurnitureService; +import com.baeldung.pattern.simplehexagonalexample.domain.services.FurnitureServiceImpl; +import com.baeldung.pattern.simplehexagonalexample.persistance.FurnitureRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class FurnitureServiceImplUnitTest { + + private final List testModelList = new ArrayList<>(); + private FurnitureRepository furnitureRepository; + private FurnitureService testService; + private Furniture testModel1; + private Furniture testModel2; + + @BeforeEach + void setUp() { + furnitureRepository = mock(FurnitureRepository.class); + + testService = new FurnitureServiceImpl(furnitureRepository); + testModel1 = new Furniture(); + testModel1.setName("bed"); + testModel1.setColor("brown"); + testModel1.setLength(50); + testModel1.setBreadth(40); + + testModel2 = new Furniture(); + testModel2.setName("sofa"); + testModel2.setColor("brown"); + testModel2.setLength(50); + testModel2.setBreadth(20); + + testModelList.add(testModel1); + testModelList.add(testModel2); + } + + @Test + void manufactureFurniture() { + when(furnitureRepository.manufactureFurniture(any(Furniture.class))).thenReturn(testModel1); + + Furniture testResponse = testService.manufactureFurniture(testModel1); + assertEquals(testModel1, testResponse); + } + + @Test + void getFurniture() { + when(furnitureRepository.getFurniture("bed")).thenReturn(testModel1); + + Furniture testResponse = testService.getFurniture("bed"); + assertEquals(testModel1, testResponse); + } + + @Test + void listAllFurniture() { + when(furnitureRepository.listAllFurniture()).thenReturn(Arrays.asList(testModel1, testModel2)); + + List testResponse = testService.listAllFurniture(); + assertEquals(testModelList, testResponse); + } +}