Skip to content

Commit

Permalink
[Order API TDD] 상품 수정 기능 POJO 구현 및 Stub 클래스를 활용한 테스트
Browse files Browse the repository at this point in the history
  • Loading branch information
jihunparkme committed Feb 27, 2024
1 parent 5a8cb1b commit ef37e18
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,13 @@ public Product(final String name, final int price, final DiscountPolicy discount
this.price = price;
this.discountPolicy = discountPolicy;
}

public void update(final String name, final int price, final DiscountPolicy discountPolicy) {
Assert.hasText(name, "상품명은 필수입니다.");
Assert.isTrue(price > 0, "상품 가격은 0보다 커야 합니다.");
Assert.notNull(discountPolicy, "할인 정책은 필수입니다.");
this.name = name;
this.price = price;
this.discountPolicy = discountPolicy;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,12 @@ public ResponseEntity<GetProductResponse> getProduct(@PathVariable final long pr
product.getDiscountPolicy());
return ResponseEntity.ok(response);
}

public void updateProduct(final Long productId, final UpdateProductRequest request) {
final Product product = productPort.getProduct(productId);

product.update(request.name(), request.price(), request.discountPolicy());

productPort.save(product);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.productorderservice.product;

import org.springframework.util.Assert;

record UpdateProductRequest(
String name,
int price,
DiscountPolicy discountPolicy) {
UpdateProductRequest {
Assert.hasText(name, "상품명은 필수입니다.");
Assert.isTrue(price > 0, "상품 가격은 0보다 커야 합니다.");
Assert.notNull(discountPolicy, "할인 정책은 필수입니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.example.productorderservice.product;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class ProductServiceTest {

private ProductService productService;
private StubProductPort productPort = new StubProductPort();

@BeforeEach
void setUp() {
productService = new ProductService(productPort);
}

@Test
void updateProduct() {
final Long productId = 1L;
final String name = "상품 수정";
int price = 2000;
final DiscountPolicy discountPolicy = DiscountPolicy.NONE;
final UpdateProductRequest request = new UpdateProductRequest(name, price, discountPolicy);
final Product product = new Product("상품명", 1000, DiscountPolicy.NONE);
productPort.getProduct_will_return = product;

productService.updateProduct(productId, request);

Assertions.assertEquals("상품 수정", product.getName());
Assertions.assertEquals(2000, product.getPrice());
}

private class StubProductPort implements ProductPort {

public Product getProduct_will_return;

@Override
public void save(final Product product) {
throw new UnsupportedOperationException("StubProductPort#save not implemented yet !!");
}

@Override
public Product getProduct(final long productId) {
return getProduct_will_return;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.productorderservice.product;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

class ProductTest {

@Test
void update() {
final Product product = new Product("상품명", 1000, DiscountPolicy.NONE);

product.update("상품 수정", 2000, DiscountPolicy.NONE);

Assertions.assertEquals("상품 수정", product.getName());
Assertions.assertEquals(2000, product.getPrice());
}
}

0 comments on commit ef37e18

Please sign in to comment.