From b67acc7ea96f836c8bd7f0e2b043312c34d446d7 Mon Sep 17 00:00:00 2001 From: haerong22 Date: Sun, 12 Feb 2023 11:23:00 +0900 Subject: [PATCH] #33 tdd(order-service): order - spring boot test --- .../order/CreateOrderRequest.java | 10 ++ .../productorderservice/order/Order.java | 25 ++++ .../order/OrderAdapter.java | 27 ++++ .../productorderservice/order/OrderPort.java | 9 ++ .../order/OrderRepository.java | 18 +++ .../order/OrderService.java | 21 +++ .../product/ProductService.java | 2 +- .../order/OrderServiceTest.java | 124 ++---------------- .../order/OrderServiceUnitTest.java | 45 +++++++ 9 files changed, 170 insertions(+), 111 deletions(-) create mode 100644 product-order-service/src/main/java/com/example/productorderservice/order/CreateOrderRequest.java create mode 100644 product-order-service/src/main/java/com/example/productorderservice/order/Order.java create mode 100644 product-order-service/src/main/java/com/example/productorderservice/order/OrderAdapter.java create mode 100644 product-order-service/src/main/java/com/example/productorderservice/order/OrderPort.java create mode 100644 product-order-service/src/main/java/com/example/productorderservice/order/OrderRepository.java create mode 100644 product-order-service/src/main/java/com/example/productorderservice/order/OrderService.java create mode 100644 product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceUnitTest.java diff --git a/product-order-service/src/main/java/com/example/productorderservice/order/CreateOrderRequest.java b/product-order-service/src/main/java/com/example/productorderservice/order/CreateOrderRequest.java new file mode 100644 index 00000000..471bacd3 --- /dev/null +++ b/product-order-service/src/main/java/com/example/productorderservice/order/CreateOrderRequest.java @@ -0,0 +1,10 @@ +package com.example.productorderservice.order; + +import org.springframework.util.Assert; + +record CreateOrderRequest(Long productId, int quantity) { + CreateOrderRequest { + Assert.notNull(productId, "상품 ID는 필수입니다."); + Assert.isTrue(quantity > 0, "수량은 0보다 커야 합니다."); + } +} diff --git a/product-order-service/src/main/java/com/example/productorderservice/order/Order.java b/product-order-service/src/main/java/com/example/productorderservice/order/Order.java new file mode 100644 index 00000000..0c6dcd35 --- /dev/null +++ b/product-order-service/src/main/java/com/example/productorderservice/order/Order.java @@ -0,0 +1,25 @@ +package com.example.productorderservice.order; + +import com.example.productorderservice.product.Product; +import org.springframework.util.Assert; + +class Order { + private Long id; + private final Product product; + private final int quantity; + + public Order(Product product, int quantity) { + Assert.notNull(product, "상품은 필수입니다."); + Assert.isTrue(quantity > 0, "수량은 0보다 커야 합니다."); + this.product = product; + this.quantity = quantity; + } + + public void assignId(Long id) { + this.id = id; + } + + public Long getId() { + return this.id; + } +} diff --git a/product-order-service/src/main/java/com/example/productorderservice/order/OrderAdapter.java b/product-order-service/src/main/java/com/example/productorderservice/order/OrderAdapter.java new file mode 100644 index 00000000..6defa83a --- /dev/null +++ b/product-order-service/src/main/java/com/example/productorderservice/order/OrderAdapter.java @@ -0,0 +1,27 @@ +package com.example.productorderservice.order; + +import com.example.productorderservice.product.Product; +import com.example.productorderservice.product.ProductRepository; +import org.springframework.stereotype.Component; + +@Component +class OrderAdapter implements OrderPort { + private final ProductRepository productRepository; + private final OrderRepository orderRepository; + + public OrderAdapter(ProductRepository productRepository, OrderRepository orderRepository) { + this.productRepository = productRepository; + this.orderRepository = orderRepository; + } + + @Override + public Product getProductById(Long productId) { + return productRepository.findById(productId) + .orElseThrow(() -> new IllegalArgumentException("상품이 존재하지 않습니다.")); + } + + @Override + public void save(Order order) { + orderRepository.save(order); + } +} diff --git a/product-order-service/src/main/java/com/example/productorderservice/order/OrderPort.java b/product-order-service/src/main/java/com/example/productorderservice/order/OrderPort.java new file mode 100644 index 00000000..7ba1c063 --- /dev/null +++ b/product-order-service/src/main/java/com/example/productorderservice/order/OrderPort.java @@ -0,0 +1,9 @@ +package com.example.productorderservice.order; + +import com.example.productorderservice.product.Product; + +interface OrderPort { + Product getProductById(Long productId); + + void save(Order order); +} diff --git a/product-order-service/src/main/java/com/example/productorderservice/order/OrderRepository.java b/product-order-service/src/main/java/com/example/productorderservice/order/OrderRepository.java new file mode 100644 index 00000000..489ae6a7 --- /dev/null +++ b/product-order-service/src/main/java/com/example/productorderservice/order/OrderRepository.java @@ -0,0 +1,18 @@ +package com.example.productorderservice.order; + +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.Map; + +@Repository +class OrderRepository { + + private final Map persistence = new HashMap<>(); + private Long sequence = 0L; + + public void save(Order order) { + order.assignId(++sequence); + persistence.put(order.getId(), order); + } +} diff --git a/product-order-service/src/main/java/com/example/productorderservice/order/OrderService.java b/product-order-service/src/main/java/com/example/productorderservice/order/OrderService.java new file mode 100644 index 00000000..49ff59d8 --- /dev/null +++ b/product-order-service/src/main/java/com/example/productorderservice/order/OrderService.java @@ -0,0 +1,21 @@ +package com.example.productorderservice.order; + +import com.example.productorderservice.product.Product; +import org.springframework.stereotype.Service; + +@Service +class OrderService { + private final OrderPort orderPort; + + OrderService(OrderPort orderPort) { + this.orderPort = orderPort; + } + + public void createOrder(CreateOrderRequest request) { + Product product = orderPort.getProductById(request.productId()); + + Order order = new Order(product, request.quantity()); + + orderPort.save(order); + } +} diff --git a/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java b/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java index ae169d12..0bdf7e47 100644 --- a/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java +++ b/product-order-service/src/main/java/com/example/productorderservice/product/ProductService.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service -class ProductService { +public class ProductService { private final ProductPort productPort; ProductService(ProductPort productPort) { diff --git a/product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceTest.java b/product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceTest.java index 99e9b7db..1364a071 100644 --- a/product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceTest.java +++ b/product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceTest.java @@ -1,128 +1,32 @@ package com.example.productorderservice.order; -import com.example.productorderservice.product.DiscountPolicy; -import com.example.productorderservice.product.Product; -import com.example.productorderservice.product.ProductRepository; -import org.junit.jupiter.api.BeforeEach; +import com.example.productorderservice.product.ProductService; +import com.example.productorderservice.product.ProductSteps; import org.junit.jupiter.api.Test; -import org.springframework.util.Assert; - -import java.util.HashMap; -import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +@SpringBootTest class OrderServiceTest { + @Autowired private OrderService orderService; - private OrderPort orderPort; - private OrderRepository orderRepository; - @BeforeEach - void setUp() { - orderRepository = new OrderRepository(); - orderPort = new OrderPort() { - @Override - public Product getProductById(Long productId) { - return new Product("상품명", 1000, DiscountPolicy.NONE); - } - - @Override - public void save(Order order) { - orderRepository.save(order); - } - }; - - orderService = new OrderService(orderPort); - } + @Autowired + private ProductService productService; @Test void 상품주문() { - final Long productId = 1L; - final int quantity = 2; - final CreateOrderRequest request = new CreateOrderRequest(productId, quantity); + productService.addProduct(ProductSteps.상품등록요청_생성()); + final CreateOrderRequest request = 상품주문요청_생성(); orderService.createOrder(request); } - private record CreateOrderRequest(Long productId, int quantity) { - private CreateOrderRequest(Long productId, int quantity) { - this.productId = productId; - this.quantity = quantity; - Assert.notNull(productId, "상품 ID는 필수입니다."); - Assert.isTrue(quantity > 0, "수량은 0보다 커야 합니다."); - } - } - - private class OrderService { - - private final OrderPort orderPort; - - private OrderService(OrderPort orderPort) { - this.orderPort = orderPort; - } - - public void createOrder(CreateOrderRequest request) { - Product product = orderPort.getProductById(request.productId()); - - Order order = new Order(product, request.quantity()); - - orderPort.save(order); - } + private static CreateOrderRequest 상품주문요청_생성() { + final Long productId = 1L; + final int quantity = 2; + return new CreateOrderRequest(productId, quantity); } - private class OrderAdapter implements OrderPort { - private final ProductRepository productRepository; - private final OrderRepository orderRepository; - - public OrderAdapter(ProductRepository productRepository, OrderRepository orderRepository) { - this.productRepository = productRepository; - this.orderRepository = orderRepository; - } - - @Override - public Product getProductById(Long productId) { - return productRepository.findById(productId) - .orElseThrow(() -> new IllegalArgumentException("상품이 존재하지 않습니다.")); - } - - @Override - public void save(Order order) { - orderRepository.save(order); - } - } - - private class Order { - private Long id; - private final Product product; - private final int quantity; - - public Order(Product product, int quantity) { - Assert.notNull(product, "상품은 필수입니다."); - Assert.isTrue(quantity > 0, "수량은 0보다 커야 합니다."); - this.product = product; - this.quantity = quantity; - } - - public void assignId(Long id) { - this.id = id; - } - - public Long getId() { - return this.id; - } - } - - private class OrderRepository { - - private final Map persistence = new HashMap<>(); - private Long sequence = 0L; - public void save(Order order) { - order.assignId(++sequence); - persistence.put(order.getId(), order); - } - } - - private interface OrderPort { - Product getProductById(Long productId); - void save(Order order); - } } diff --git a/product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceUnitTest.java b/product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceUnitTest.java new file mode 100644 index 00000000..dc0f5218 --- /dev/null +++ b/product-order-service/src/test/java/com/example/productorderservice/order/OrderServiceUnitTest.java @@ -0,0 +1,45 @@ +package com.example.productorderservice.order; + +import com.example.productorderservice.product.DiscountPolicy; +import com.example.productorderservice.product.Product; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class OrderServiceUnitTest { + + private OrderService orderService; + private OrderPort orderPort; + private OrderRepository orderRepository; + + @BeforeEach + void setUp() { + orderRepository = new OrderRepository(); + orderPort = new OrderPort() { + @Override + public Product getProductById(Long productId) { + return new Product("상품명", 1000, DiscountPolicy.NONE); + } + + @Override + public void save(Order order) { + orderRepository.save(order); + } + }; + + orderService = new OrderService(orderPort); + } + + @Test + void 상품주문() { + final CreateOrderRequest request = 상품주문요청_생성(); + + orderService.createOrder(request); + } + + private static CreateOrderRequest 상품주문요청_생성() { + final Long productId = 1L; + final int quantity = 2; + return new CreateOrderRequest(productId, quantity); + } + +}