上一批只落了实体与 oapi 出参,管理端 save 入参与编辑回显没接上, 导致 front 录入的 6 个字段被 Jackson 静默丢弃。 - SvcModels.SvcItemSaveRequest 补 7 字段(含 @Size 校验,与实体列长一致) - SvcModels.SvcItemEditVo 补 7 字段 + of() 映射 - ServiceItemService.adminSave 补 7 行赋值(空串归一 null) - 新增 SvcItemPromiseFieldsTest:反序列化字段名对齐 + EditVo 映射(3 例) - .gitignore 排除 local-debug/(本地探针,不入库)
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
package com.yunhai.svchall.model.svc;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.yunhai.svchall.entity.ServiceItem;
|
||||
import com.yunhai.svchall.model.svc.SvcModels.SvcItemEditVo;
|
||||
import com.yunhai.svchall.model.svc.SvcModels.SvcItemSaveRequest;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
/**
|
||||
* 服务承诺字段(P1-1)的入参与回显契约测试。
|
||||
* <p>
|
||||
* 守两件事:
|
||||
* ① 管理端前端用的字段名 → {@link SvcItemSaveRequest} 能反序列化进来(Jackson 默认忽略未知字段,
|
||||
* 名字写错不会报错、只会静默丢数据,必须显式测);
|
||||
* ② {@link SvcItemEditVo#of} 能把实体上的 7 个字段原样映射到编辑页回显。
|
||||
* <p>
|
||||
* 不测 adminSave 的落库:那需要 mock repository,价值低于上面两条(字段名对齐是最易错点)。
|
||||
*/
|
||||
class SvcItemPromiseFieldsTest {
|
||||
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
@Test
|
||||
@DisplayName("SaveRequest 能接住前端传来的 7 个承诺字段(字段名不得漂移)")
|
||||
void saveRequestDeserializesPromiseFields() throws Exception {
|
||||
String json = "{"
|
||||
+ "\"coopDepts\":\"组织部、教务处\","
|
||||
+ "\"handlerName\":\"田老师\","
|
||||
+ "\"handleTimeDesc\":\"工作日 08:00-11:45\","
|
||||
+ "\"runCount\":1,"
|
||||
+ "\"expressFlag\":2,"
|
||||
+ "\"feeDesc\":\"50 元\","
|
||||
+ "\"feeBasis\":\"浙价费〔2020〕1 号\""
|
||||
+ "}";
|
||||
|
||||
SvcItemSaveRequest req = MAPPER.readValue(json, SvcItemSaveRequest.class);
|
||||
|
||||
assertEquals("组织部、教务处", req.getCoopDepts());
|
||||
assertEquals("田老师", req.getHandlerName());
|
||||
assertEquals("工作日 08:00-11:45", req.getHandleTimeDesc());
|
||||
assertEquals(1, req.getRunCount());
|
||||
assertEquals(2, req.getExpressFlag());
|
||||
assertEquals("50 元", req.getFeeDesc());
|
||||
assertEquals("浙价费〔2020〕1 号", req.getFeeBasis());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("EditVo.of 把实体 7 个承诺字段映射到回显")
|
||||
void editVoMapsPromiseFields() {
|
||||
ServiceItem item = new ServiceItem();
|
||||
item.setId(12);
|
||||
item.setSiteCode("yhms");
|
||||
item.setItemCode("teacher-onboard");
|
||||
item.setTitle("教师入职办理");
|
||||
item.setCoopDepts("组织部、教务处");
|
||||
item.setHandlerName("田老师");
|
||||
item.setHandleTimeDesc("工作日 08:00-11:45");
|
||||
item.setRunCount(0);
|
||||
item.setExpressFlag(1);
|
||||
item.setFeeDesc("无");
|
||||
item.setFeeBasis(null);
|
||||
|
||||
SvcItemEditVo vo = SvcItemEditVo.of(item);
|
||||
|
||||
assertEquals("组织部、教务处", vo.getCoopDepts());
|
||||
assertEquals("田老师", vo.getHandlerName());
|
||||
assertEquals("工作日 08:00-11:45", vo.getHandleTimeDesc());
|
||||
assertEquals(0, vo.getRunCount());
|
||||
assertEquals(1, vo.getExpressFlag());
|
||||
assertEquals("无", vo.getFeeDesc());
|
||||
assertNull(vo.getFeeBasis());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("承诺字段全空时 SaveRequest 不报错(全部可空)")
|
||||
void saveRequestAllowsNulls() throws Exception {
|
||||
SvcItemSaveRequest req = MAPPER.readValue("{\"title\":\"x\"}", SvcItemSaveRequest.class);
|
||||
|
||||
assertNull(req.getCoopDepts());
|
||||
assertNull(req.getRunCount());
|
||||
assertNull(req.getExpressFlag());
|
||||
assertNull(req.getFeeDesc());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user