Skip to content

Commit 34c11ff

Browse files
committed
TDD 관련 내용 추
1 parent 5284acc commit 34c11ff

29 files changed

+565
-0
lines changed

tdd-example/build.gradle

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
plugins {
2+
id 'java'
3+
id 'org.springframework.boot' version '3.2.2'
4+
id 'io.spring.dependency-management' version '1.1.4'
5+
}
6+
7+
group = 'org.example'
8+
version = '0.0.1-SNAPSHOT'
9+
10+
java {
11+
sourceCompatibility = '17'
12+
}
13+
14+
configurations {
15+
compileOnly {
16+
extendsFrom annotationProcessor
17+
}
18+
}
19+
20+
repositories {
21+
mavenCentral()
22+
}
23+
24+
dependencies {
25+
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
26+
implementation 'org.springframework.boot:spring-boot-starter-web'
27+
compileOnly 'org.projectlombok:lombok'
28+
runtimeOnly 'com.h2database:h2'
29+
annotationProcessor 'org.projectlombok:lombok'
30+
testImplementation 'org.springframework.boot:spring-boot-starter-test'
31+
testImplementation 'io.rest-assured:rest-assured' // spring-boot 3는 rest-assured 5 이상을 사용해야함
32+
implementation "com.google.guava:guava:33.0.0-jre"
33+
34+
// testImplementation 'io.rest-assured:rest-assured:4.4.0'
35+
}
36+
37+
tasks.named('test') {
38+
useJUnitPlatform()
39+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.example.tddexample.product;
2+
3+
import org.springframework.util.Assert;
4+
5+
record AddProductRequest(String name, int price, Discountpolicy discountpolicy) {
6+
AddProductRequest {
7+
Assert.hasText(name, "상품명은 필수입니다.");
8+
Assert.isTrue(price > 0, "상품 가격은 0보다 커야 합니다.");
9+
Assert.notNull(discountpolicy, "할인정책은 필수입니다.");
10+
}
11+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.example.tddexample.product;
2+
3+
enum Discountpolicy {
4+
NONE
5+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.example.tddexample.product;
2+
3+
import org.springframework.util.Assert;
4+
5+
class Product {
6+
private Long id;
7+
private final String name;
8+
private final int price;
9+
private final Discountpolicy discountpolicy;
10+
11+
Product(String name, int price, Discountpolicy discountpolicy) {
12+
Assert.hasText(name, "상품명은 필수입니다.");
13+
Assert.isTrue(price > 0, "상품 가격은 0보다 커야 합니다.");
14+
Assert.notNull(discountpolicy, "할인 정책은 필수입니다.");
15+
16+
this.name = name;
17+
this.price = price;
18+
this.discountpolicy = discountpolicy;
19+
}
20+
21+
public void assignId(final Long id) {
22+
this.id = id;
23+
}
24+
25+
26+
public Long getId() {
27+
return id;
28+
}
29+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.example.tddexample.product;
2+
3+
class ProductAdapter implements ProductPort {
4+
private final ProductRepository productRepository;
5+
6+
ProductAdapter(ProductRepository productRepository) {
7+
this.productRepository = productRepository;
8+
}
9+
10+
@Override
11+
public void save(final Product product) {
12+
productRepository.save(product);
13+
}
14+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.example.tddexample.product;
2+
3+
interface ProductPort {
4+
void save(final Product product);
5+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.example.tddexample.product;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
class ProductRepository {
7+
private Map<Long, Product> persistence = new HashMap<>();
8+
private Long sequence = 0L;
9+
10+
public void save(final Product product) {
11+
product.assignId(++sequence);
12+
persistence.put(product.getId(), product);
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.example.tddexample.product;
2+
3+
class ProductService {
4+
private final ProductPort productPort;
5+
6+
ProductService(ProductPort productPort) {
7+
this.productPort = productPort;
8+
}
9+
10+
public void addProduct(final AddProductRequest request) {
11+
final Product product = new Product(request.name(), request.price(), request.discountpolicy());
12+
productPort.save(product);
13+
}
14+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.example.tddexample.product;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
6+
class ProductServiceTest {
7+
private ProductService productService;
8+
private ProductPort productPort;
9+
private ProductRepository productRepository;
10+
11+
@BeforeEach
12+
void setup() {
13+
productRepository = new ProductRepository();
14+
productPort = new ProductAdapter(productRepository);
15+
productService = new ProductService(productPort);
16+
}
17+
18+
@Test
19+
void 상품등록() {
20+
final AddProductRequest request = 상품등록요청_생성();
21+
22+
productService.addProduct(request);
23+
}
24+
25+
private static AddProductRequest 상품등록요청_생성() {
26+
final String name = "상품명";
27+
final int price = 1000;
28+
final Discountpolicy policy = Discountpolicy.NONE;
29+
final AddProductRequest request = new AddProductRequest(name, price, policy);
30+
return request;
31+
}
32+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.example.tddexample.product;
2+
3+
import org.springframework.util.Assert;
4+
5+
record AddProductRequest(String name, int price, Discountpolicy discountpolicy) {
6+
AddProductRequest {
7+
Assert.hasText(name, "상품명은 필수입니다.");
8+
Assert.isTrue(price > 0, "상품 가격은 0보다 커야 합니다.");
9+
Assert.notNull(discountpolicy, "할인정책은 필수입니다.");
10+
}
11+
}

0 commit comments

Comments
 (0)