12.23 源创会 · 上海站,聊聊 LLM 基础设施
                                                                        Aggregate Unit Test (
  Saga Unit Test (
         
  
ZhouSa.com-周飒博客		
                                                                        架构图
WaitStrategy:PROCESSED
下单
- 请求
 - 详细报告 (PDF)-SENT
 - 详细报告 (PDF)-PROCESSED
 
WaitStrategy:SENT
WaitStrategy:PROCESSED
事件源
OpenAPI (Spring WebFlux 集成)
自动注册 命令 路由处理函数 (
HandlerFunction) ,开发人员仅需编写领域模型,即可完成服务开发。
测试套件:80%+ 的测试覆盖率轻而易举
Given -> When -> Expect .
前置条件
- 理解 领域驱动设计:《实现领域驱动设计》、《领域驱动设计:软件核心复杂性应对之道》
 - 理解 命令查询职责分离(CQRS)
 - 理解 事件源架构
 - 理解 响应式编程
 
Example
订单服务(Kotlin)
Example-Order
银行转账(JAVA)
Example-Transfer
单元测试套件
80%+ 的测试覆盖率轻而易举。
Given -> When -> Expect .
Aggregate Unit Test (AggregateVerifier)
  Aggregate Test
 internal class OrderTest {      @Test     private fun createOrder() {         val tenantId = GlobalIdGenerator.generateAsString()         val customerId = GlobalIdGenerator.generateAsString()          val orderItem = OrderItem(             GlobalIdGenerator.generateAsString(),             GlobalIdGenerator.generateAsString(),             BigDecimal.valueOf(10),             10,         )         val orderItems = listOf(orderItem)         val inventoryService = object : InventoryService {             override fun getInventory(productId: String): Mono<Int> {                 return orderItems.filter { it.productId == productId }.map { it.quantity }.first().toMono()             }         }         val pricingService = object : PricingService {             override fun getProductPrice(productId: String): Mono<BigDecimal> {                 return orderItems.filter { it.productId == productId }.map { it.price }.first().toMono()             }         }         aggregateVerifier<Order, OrderState>(tenantId = tenantId)             .inject(DefaultCreateOrderSpec(inventoryService, pricingService))             .given()             .`when`(CreateOrder(customerId, orderItems, SHIPPING_ADDRESS, false))             .expectEventCount(1)             .expectEventType(OrderCreated::class.java)             .expectStateAggregate {                 assertThat(it.aggregateId.tenantId, equalTo(tenantId))             }             .expectState {                 assertThat(it.id, notNullValue())                 assertThat(it.customerId, equalTo(customerId))                 assertThat(it.address, equalTo(SHIPPING_ADDRESS))                 assertThat(it.items, equalTo(orderItems))                 assertThat(it.status, equalTo(OrderStatus.CREATED))             }             .verify()     }      @Test     fun createOrderGivenEmptyItems() {         val customerId = GlobalIdGenerator.generateAsString()         aggregateVerifier<Order, OrderState>()             .inject(mockk<CreateOrderSpec>(), "createOrderSpec")             .given()             .`when`(CreateOrder(customerId, listOf(), SHIPPING_ADDRESS, false))             .expectErrorType(IllegalArgumentException::class.java)             .expectStateAggregate {                 /*                  * 该聚合对象处于未初始化状态,即该聚合未创建成功.                  */                 assertThat(it.initialized, equalTo(false))             }.verify()     }      /**      * 创建订单-库存不足      */     @Test     fun createOrderWhenInventoryShortage() {         val customerId = GlobalIdGenerator.generateAsString()         val orderItem = OrderItem(             GlobalIdGenerator.generateAsString(),             GlobalIdGenerator.generateAsString(),             BigDecimal.valueOf(10),             10,         )         val orderItems = listOf(orderItem)         val inventoryService = object : InventoryService {             override fun getInventory(productId: String): Mono<Int> {                 return orderItems.filter { it.productId == productId }                     /*                      * 模拟库存不足                      */                     .map { it.quantity - 1 }.first().toMono()             }         }         val pricingService = object : PricingService {             override fun getProductPrice(productId: String): Mono<BigDecimal> {                 return orderItems.filter { it.productId == productId }.map { it.price }.first().toMono()             }         }          aggregateVerifier<Order, OrderState>()             .inject(DefaultCreateOrderSpec(inventoryService, pricingService))             .given()             .`when`(CreateOrder(customerId, orderItems, SHIPPING_ADDRESS, false))             /*              * 期望:库存不足异常.              */             .expectErrorType(InventoryShortageException::class.java)             .expectStateAggregate {                 /*                  * 该聚合对象处于未初始化状态,即该聚合未创建成功.                  */                 assertThat(it.initialized, equalTo(false))             }.verify()     } }  Saga Unit Test (SagaVerifier)
  Saga Test
 class CartSagaTest {      @Test     fun onOrderCreated() {         val orderItem = OrderItem(             GlobalIdGenerator.generateAsString(),             GlobalIdGenerator.generateAsString(),             BigDecimal.valueOf(10),             10,         )         sagaVerifier<CartSaga>()             .`when`(                 mockk<OrderCreated> {                     every {                         customerId                     } returns "customerId"                     every {                         items                     } returns listOf(orderItem)                     every {                         fromCart                     } returns true                 },             )             .expectCommandBody<RemoveCartItem> {                 assertThat(it.id, equalTo("customerId"))                 assertThat(it.productIds, hasSize(1))                 assertThat(it.productIds.first(), equalTo(orderItem.productId))             }             .verify()     } }        设计
聚合建模
| Single Class | Inheritance Pattern | Aggregation Pattern | 
|---|---|---|











		
		
		

还没有评论,来说两句吧...