|
|
@@ -0,0 +1,130 @@
|
|
|
+package com.etotem.cfc.service;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.etotem.cfc.dto.SelfCheckResultVO;
|
|
|
+import com.etotem.cfc.dto.SubmitSelfCheckDTO;
|
|
|
+import com.etotem.cfc.entity.FamilyMember;
|
|
|
+import com.etotem.cfc.entity.FiveDimensionSelfCheck;
|
|
|
+import com.etotem.cfc.mapper.FamilyMemberMapper;
|
|
|
+import com.etotem.cfc.mapper.FiveDimensionSelfCheckMapper;
|
|
|
+import org.junit.jupiter.api.BeforeEach;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+import org.mockito.ArgumentCaptor;
|
|
|
+import org.mockito.Mock;
|
|
|
+import org.mockito.MockitoAnnotations;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
+import static org.mockito.ArgumentMatchers.*;
|
|
|
+import static org.mockito.Mockito.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * FiveDimensionSelfCheckService 纯单元测试(无 SpringBootTest,避免 MySQL 连接)
|
|
|
+ *
|
|
|
+ * 测试范围:
|
|
|
+ * - submitSelfCheck: familyMemberId 未传时自动解析为当前用户本人对应的家庭成员(Bug 修复回归)
|
|
|
+ * - submitSelfCheck: familyMemberId 已传时直接使用,不覆盖
|
|
|
+ */
|
|
|
+public class FiveDimensionSelfCheckServiceTest {
|
|
|
+
|
|
|
+ @Mock
|
|
|
+ private FiveDimensionSelfCheckMapper selfCheckMapper;
|
|
|
+
|
|
|
+ @Mock
|
|
|
+ private WuxingSourcingService wuxingSourcingService;
|
|
|
+
|
|
|
+ @Mock
|
|
|
+ private OnboardingService onboardingService;
|
|
|
+
|
|
|
+ @Mock
|
|
|
+ private FamilyMemberMapper familyMemberMapper;
|
|
|
+
|
|
|
+ private FiveDimensionSelfCheckService service;
|
|
|
+
|
|
|
+ @BeforeEach
|
|
|
+ public void setup() throws Exception {
|
|
|
+ MockitoAnnotations.openMocks(this);
|
|
|
+ service = new FiveDimensionSelfCheckService();
|
|
|
+ setField(service, "selfCheckMapper", selfCheckMapper);
|
|
|
+ setField(service, "wuxingSourcingService", wuxingSourcingService);
|
|
|
+ setField(service, "onboardingService", onboardingService);
|
|
|
+ setField(service, "familyMemberMapper", familyMemberMapper);
|
|
|
+
|
|
|
+ // 默认 mock:全部维度健康,无寻源建议
|
|
|
+ when(wuxingSourcingService.getAdvicesForLowScores(anyMap())).thenReturn(new ArrayList<>());
|
|
|
+ when(wuxingSourcingService.levelOf(anyInt())).thenReturn("healthy");
|
|
|
+ when(wuxingSourcingService.levelName(anyString())).thenReturn("健康");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void submitSelfCheck_resolvesOwnFamilyMemberId_whenNotProvided() throws Exception {
|
|
|
+ Long userId = 7L;
|
|
|
+
|
|
|
+ // 当前用户本人对应一个家庭成员(注册时自动创建)
|
|
|
+ FamilyMember ownMember = new FamilyMember();
|
|
|
+ ownMember.setId(100L);
|
|
|
+ ownMember.setUserId(userId);
|
|
|
+ when(familyMemberMapper.selectOne(any(LambdaQueryWrapper.class))).thenReturn(ownMember);
|
|
|
+
|
|
|
+ // 捕获 insert 的记录并赋予 id(toVO 读取)
|
|
|
+ ArgumentCaptor<FiveDimensionSelfCheck> captor = ArgumentCaptor.forClass(FiveDimensionSelfCheck.class);
|
|
|
+ doAnswer(inv -> {
|
|
|
+ FiveDimensionSelfCheck r = inv.getArgument(0);
|
|
|
+ r.setId(5L);
|
|
|
+ return 1;
|
|
|
+ }).when(selfCheckMapper).insert(captor.capture());
|
|
|
+
|
|
|
+ SubmitSelfCheckDTO dto = new SubmitSelfCheckDTO();
|
|
|
+ dto.setAnswers(fullAnswers());
|
|
|
+
|
|
|
+ SelfCheckResultVO vo = service.submitSelfCheck(dto, userId);
|
|
|
+
|
|
|
+ // 返回给前端的 VO 应带上解析出的家庭成员ID
|
|
|
+ assertNotNull(vo.getFamilyMemberId(), "未传 familyMemberId 时应自动解析为当前用户本人的家庭成员");
|
|
|
+ assertEquals(100L, vo.getFamilyMemberId().longValue());
|
|
|
+ // 落库记录也应带解析出的家庭成员ID
|
|
|
+ assertEquals(100L, captor.getValue().getFamilyMemberId().longValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void submitSelfCheck_keepsProvidedFamilyMemberId() throws Exception {
|
|
|
+ Long userId = 7L;
|
|
|
+
|
|
|
+ ArgumentCaptor<FiveDimensionSelfCheck> captor = ArgumentCaptor.forClass(FiveDimensionSelfCheck.class);
|
|
|
+ doAnswer(inv -> {
|
|
|
+ FiveDimensionSelfCheck r = inv.getArgument(0);
|
|
|
+ r.setId(6L);
|
|
|
+ return 1;
|
|
|
+ }).when(selfCheckMapper).insert(captor.capture());
|
|
|
+
|
|
|
+ SubmitSelfCheckDTO dto = new SubmitSelfCheckDTO();
|
|
|
+ dto.setFamilyMemberId(200L);
|
|
|
+ dto.setAnswers(fullAnswers());
|
|
|
+
|
|
|
+ SelfCheckResultVO vo = service.submitSelfCheck(dto, userId);
|
|
|
+
|
|
|
+ assertEquals(200L, vo.getFamilyMemberId().longValue());
|
|
|
+ assertEquals(200L, captor.getValue().getFamilyMemberId().longValue());
|
|
|
+ // 未触发家庭成员查询
|
|
|
+ verify(familyMemberMapper, never()).selectOne(any(LambdaQueryWrapper.class));
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<SubmitSelfCheckDTO.AnswerItem> fullAnswers() {
|
|
|
+ List<SubmitSelfCheckDTO.AnswerItem> answers = new ArrayList<>();
|
|
|
+ for (int i = 1; i <= 15; i++) {
|
|
|
+ SubmitSelfCheckDTO.AnswerItem item = new SubmitSelfCheckDTO.AnswerItem();
|
|
|
+ item.setQuestionId(i);
|
|
|
+ item.setAnswer("A");
|
|
|
+ answers.add(item);
|
|
|
+ }
|
|
|
+ return answers;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void setField(Object target, String fieldName, Object value) throws Exception {
|
|
|
+ java.lang.reflect.Field f = target.getClass().getDeclaredField(fieldName);
|
|
|
+ f.setAccessible(true);
|
|
|
+ f.set(target, value);
|
|
|
+ }
|
|
|
+}
|