diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFiveServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFiveServiceImpl.java index ca6ba10..fa36cec 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFiveServiceImpl.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFiveServiceImpl.java @@ -54,7 +54,12 @@ public class MarketOpportunitySelectionStepFiveServiceImpl implements MarketOppo @SuppressWarnings("unchecked") private void requireCompletedStepFour(String answerJson) { - Map outcome = JSON.parseObject(answerJson, LinkedHashMap.class); + Map outcome; + try { + outcome = JSON.parseObject(answerJson, LinkedHashMap.class); + } catch (RuntimeException error) { + throw badRequest("请先完成并保存第 4 步数据可视化"); + } Object rawVisualization = outcome == null ? null : outcome.get("visualization"); Object url = rawVisualization instanceof Map ? ((Map) rawVisualization).get("url") : null; if (!(rawVisualization instanceof Map) || url == null || StringUtils.isBlank(String.valueOf(url))) throw badRequest("请先完成并保存第 4 步数据可视化"); diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFiveServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFiveServiceImplTest.java new file mode 100644 index 0000000..9452899 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFiveServiceImplTest.java @@ -0,0 +1,36 @@ +package com.sztzjy.linkCommerce.service.impl; + +import com.sztzjy.linkCommerce.config.exception.handler.ServiceException; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.StudentTrainingAnswer; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFiveValidationRequest; +import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class MarketOpportunitySelectionStepFiveServiceImplTest { + @Test + void validateRejectsMalformedSavedStepFourAnswerAsBadRequest() { + MarketOpportunitySelectionStepFiveServiceImpl service = new MarketOpportunitySelectionStepFiveServiceImpl(); + StudentTrainingAnswerService answers = mock(StudentTrainingAnswerService.class); + StudentTrainingAnswer answer = new StudentTrainingAnswer(); + answer.setStep4Answer("{not-valid-json"); + when(answers.get(anyString(), any(), any(JwtUser.class))).thenReturn(answer); + ReflectionTestUtils.setField(service, "studentTrainingAnswerService", answers); + + assertThrows(ServiceException.class, () -> service.validate(new MarketOpportunitySelectionStepFiveValidationRequest(), student())); + } + + private JwtUser student() { + JwtUser user = new JwtUser(); + user.setUserId("stu-1"); + user.setRoleId(4); + return user; + } +}