Skip to content

Commit

Permalink
[#3] 테스트 케이스 주석 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
gugbab2 committed Jan 2, 2025
1 parent 7c5c5aa commit 75546ca
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public ResponseEntity<Payment> processPayment(@PathVariable String entryId, @Req

@PostMapping("/{entryId}/check-winner")
public ResponseEntity<Entry> checkWinner(@PathVariable String entryId) {
Entry entry = entryService.processWinner(entryId);
Entry entry = entryService.checkWinner(entryId);
return new ResponseEntity<>(entry, HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public Payment processPayment(String entryId, PaymentDto paymentDto) {
return paymentRepository.save(payment);
}

public Entry processWinner(String entryId) {
public Entry checkWinner(String entryId) {
Entry entry = entryRepository.findById(entryId);
// 예외처리
char isWinner = entry.getIsWinner();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,29 +44,51 @@ void testCreateEntry() {
String paymentMethod = "Credit Card";
String entryId = "entry-123";

/*
[given]
1. 고정된 mockProduct, mockEntry 리턴
*/
Product mockProduct = new Product(productId, "Test Product", 100.0, "L", "test");
Entry mockEntry = new Entry(entryId, mockProduct, shippingAddress, paymentMethod);

when(productRepository.findById(productId)).thenReturn(mockProduct);
when(entryRepository.save(any(Entry.class))).thenReturn(mockEntry);

/*
[when]
1. 응모 생성
*/
Entry entry = entryService.createEntry(productId, shippingAddress, paymentMethod);

/*
[then]
1. 응모가 not null 이어야 한다.
2. mockProduct 와 응모 내 product 는 동일해야 한다.
3. shippingAddress 와 응모 내 shippingAddress 는 동일해야 한다.
4. paymentMethod 와 응모 내 paymentMethod 는 동일해야 한다.
*/
assertNotNull(entry);
assertEquals(mockProduct, entry.getProduct());
assertEquals(shippingAddress, entry.getShippingAddress());
assertEquals(paymentMethod, entry.getPaymentMethod());

verify(productRepository, times(1)).findById(productId);
verify(entryRepository, times(1)).save(any(Entry.class));
// verify(productRepository, times(1)).findById(productId);
// verify(entryRepository, times(1)).save(any(Entry.class));
}

@Test
@DisplayName("응모 후 결제")
void testProcessPayment() {
String entryId = "entry-123";
PaymentDto paymentDto = new PaymentDto("123 Main St", "Credit Card", 100.0);
String shippingAddress = "123 Main St";
String paymentMethod = "Credit Card";
PaymentDto paymentDto = new PaymentDto(shippingAddress, paymentMethod, 100.0);

/*
[given]
1. 결제 상태 변경 : 결제 성공
2. 고정된 mockEntry, mockPayment 리턴
*/
Product mockProduct = new Product("product-123", "Test Product", 100.0, "L", "test");
Entry mockEntry = new Entry(entryId, mockProduct, "123 Main St", "Credit Card");
Payment mockPayment = new Payment("payment-123", mockEntry, paymentDto.getAmount());
Expand All @@ -75,21 +97,36 @@ void testProcessPayment() {
when(entryRepository.findById(entryId)).thenReturn(mockEntry);
when(paymentRepository.save(any(Payment.class))).thenReturn(mockPayment);

/*
[when]
1. 결제 진행
*/
Payment payment = entryService.processPayment(entryId, paymentDto);

/*
[then]
1. 결제가 not null 이어야 한다.
2. 결제가 성공해야 한다.
3. paymentDto 내 금액은 결제 내 금액과 동일해야 한다.
*/
assertNotNull(payment);
assertTrue(payment.isSuccess());
assertEquals(paymentDto.getAmount(), payment.getAmount());

verify(entryRepository, times(1)).findById(entryId);
verify(paymentRepository, times(1)).save(any(Payment.class));
// verify(entryRepository, times(1)).findById(entryId);
// verify(paymentRepository, times(1)).save(any(Payment.class));
}

@Test
@DisplayName("응모 확인 시 미당첨이라면 환불")
void testProcessWinnerWithRefund() {
String entryId = "entry-123";

/*
[given]
1. 응모 상태 변경 : 미당첨
2. 고정된 mockEntry, mockPayment 리턴
*/
Product mockProduct = new Product("product-123", "Test Product", 100.0, "L", "test");
Entry mockEntry = new Entry(entryId, mockProduct, "123 Main St", "Credit Card");
mockEntry.setIsWinner('2'); // 미당첨
Expand All @@ -99,34 +136,60 @@ void testProcessWinnerWithRefund() {
when(entryRepository.findById(entryId)).thenReturn(mockEntry);
when(paymentRepository.findById(entryId)).thenReturn(mockPayment);

Entry entry = entryService.processWinner(entryId);

/*
[when]
1. 응모 상태 확인
2. 미당첨이라면 자동 환불
*/
Entry entry = entryService.checkWinner(entryId);

/*
[then]
1. 응모가 not null 이어야 한다.
2. 응모 결과가 미당첨이어야 한다.
3. 결제는 성공 상태여야 한다.
*/
assertNotNull(entry);
assertEquals('2', entry.getIsWinner());
assertFalse(mockPayment.isSuccess());

verify(entryRepository, times(1)).findById(entryId);
verify(paymentRepository, times(1)).findById(entryId);
verify(paymentRepository, times(1)).save(mockPayment);
// verify(entryRepository, times(1)).findById(entryId);
// verify(paymentRepository, times(1)).findById(entryId);
// verify(paymentRepository, times(1)).save(mockPayment);
}

@Test
@DisplayName("응모 확인 시 당첨이라면 상태 유지")
void testProcessWinnerWithoutRefund() {
String entryId = "entry-123";

/*
[given]
1. 응모 상태 변경 : 당첨
2. 고정된 mockEntry, mockPayment 리턴
*/
Product mockProduct = new Product("product-123", "Test Product", 100.0, "L", "test");
Entry mockEntry = new Entry(entryId, mockProduct, "123 Main St", "Credit Card");
mockEntry.setIsWinner('1'); // 당첨

when(entryRepository.findById(entryId)).thenReturn(mockEntry);

Entry entry = entryService.processWinner(entryId);

/*
[when]
1. 응모 상태 확인
2. 당첨이라면 상태 유지
*/
Entry entry = entryService.checkWinner(entryId);

/*
[then]
1. 응모가 not null 이어야 한다.
2. 응모 결과가 당첨이어야 한다.
*/
assertNotNull(entry);
assertEquals('1', entry.getIsWinner());

verify(entryRepository, times(1)).findById(entryId);
verifyNoInteractions(paymentRepository);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,36 +31,65 @@ void setUp() {
@DisplayName("제품 생성")
void testCreateProduct() {

/*
[given]
1. 고정된 mockProduct 리턴
*/
Product mockProduct = new Product("product-123", "Test Product", 100.0, "L", "Test Category");

when(productRepository.save(any(Product.class))).thenReturn(mockProduct);

/*
[when]
1. 상품 등록 실행
*/
Product createdProduct = productService.createProduct(mockProduct);

// Assert
/*
[then]
1. 생성된 상품의 id 는 not null 이어야 한다.
2. 생성된 상품의 이름은 mock 객체 이름과 동일해야 한다.
3. 생성된 상품의 카테고리는 mock 객체 카테고리와 동일해야 한다.
*/
assertNotNull(createdProduct.getId());
assertEquals("Test Product", createdProduct.getName());
assertEquals("Test Category", createdProduct.getCategory());
verify(productRepository, times(1)).save(any(Product.class));

// verify(productRepository, times(1)).save(any(Product.class));
}

@Test
@DisplayName("하나의 제품 조회")
void testGetProduct() {

String productId = "product-123";
/*
[given]
1. 고정된 mockProduct 리턴
*/
Product mockProduct = new Product("product-123", "Test Product", 100.0, "L", "Test Category");

when(productRepository.findById(productId)).thenReturn(mockProduct);

/*
[when]
1. 상품 조회(단건)
*/
Product foundProduct = productService.getProduct(productId);

/*
[when]
1. 조회한 상품은 not null 이어야 한다.
2. 조회한 상품의 ID 는 mock 객체의 ID 이어야 한다.
3. 조회한 상품의 이름은 mock 객체의 이름이어야 한다.
4. 조회한 상품의 카테고리는 mock 객체의 카테고리어야 한다.
*/
assertNotNull(foundProduct);
assertEquals(productId, foundProduct.getId());
assertEquals("Test Product", foundProduct.getName());
assertEquals("Test Category", foundProduct.getCategory());

verify(productRepository, times(1)).findById(productId);
// verify(productRepository, times(1)).findById(productId);
}

@Test
Expand All @@ -71,19 +100,33 @@ void testGetProductsByCategory() {
int size = 3;

String category = "Test Category";

/*
[given]
1. 동일한 카테고리의 products 리턴
*/
Product mockProduct1 = new Product("product-111", "Test Product 1", 100.0, "L", category);
Product mockProduct2 = new Product("product-222", "Test Product 2", 100.0, "L", category);
Product mockProduct3 = new Product("product-333", "Test Product 3", 100.0, "L", category);

when(productRepository.findByCategory(category)).thenReturn(List.of(mockProduct1, mockProduct2, mockProduct3));

/*
[when]
1. 카테고리 기반으로 상품 조회
*/
List<Product> products = productService.getProductsByCategory(category, page, size);

/*
[when]
1. 상품이 not null 이면 안된다.
2. 상품이 이름이 순서대로 mock 상품의 이름과 동일해야 한다.
*/
assertNotNull(products);
assertEquals(3, products.size());
assertEquals("Test Product 1", products.get(0).getName());
assertEquals("Test Product 2", products.get(1).getName());
assertEquals("Test Product 3", products.get(2).getName());
verify(productRepository, times(1)).findByCategory(category);

// verify(productRepository, times(1)).findByCategory(category);
}
}

0 comments on commit 75546ca

Please sign in to comment.