package com.tcm.training.admin.system.service; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.tcm.training.admin.system.dto.CommonQuestionSaveRequest; import com.tcm.training.admin.system.entity.CommonQuestion; import com.tcm.training.admin.system.mapper.CommonQuestionMapper; import com.tcm.training.admin.system.vo.CommonQuestionDetailVO; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDateTime; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class CommonQuestionAppServiceTest { @BeforeAll static void initLambdaCache() { MapperBuilderAssistant assistant = new MapperBuilderAssistant(new MybatisConfiguration(), ""); TableInfoHelper.initTableInfo(assistant, CommonQuestion.class); } @Mock private CommonQuestionMapper commonQuestionMapper; @InjectMocks private CommonQuestionAppService commonQuestionAppService; @Captor private ArgumentCaptor commonQuestionCaptor; @Test void createShouldPersistQuestion() { doAnswer(invocation -> { CommonQuestion item = invocation.getArgument(0); item.setId(1L); return 1; }).when(commonQuestionMapper).insert(any(CommonQuestion.class)); CommonQuestion persisted = new CommonQuestion(); persisted.setId(1L); persisted.setTitle("常见问题"); persisted.setContentHtml("

内容

"); persisted.setCreatedAt(LocalDateTime.of(2026, 3, 26, 21, 10, 0)); when(commonQuestionMapper.selectOne(any())).thenReturn(persisted); CommonQuestionSaveRequest request = new CommonQuestionSaveRequest(); request.setTitle(" 常见问题 "); request.setContentHtml("

内容

"); CommonQuestionDetailVO result = commonQuestionAppService.create(request); verify(commonQuestionMapper).insert(commonQuestionCaptor.capture()); assertEquals("常见问题", commonQuestionCaptor.getValue().getTitle()); assertEquals("

内容

", commonQuestionCaptor.getValue().getContentHtml()); assertEquals("常见问题", result.getTitle()); } @Test void updateShouldPersistQuestion() { CommonQuestion persisted = new CommonQuestion(); persisted.setId(2L); persisted.setTitle("旧问题"); persisted.setContentHtml("

旧内容

"); when(commonQuestionMapper.selectOne(any())).thenReturn(persisted); CommonQuestionSaveRequest request = new CommonQuestionSaveRequest(); request.setTitle("新问题"); request.setContentHtml("

新内容

"); commonQuestionAppService.update(2L, request); verify(commonQuestionMapper).updateById(commonQuestionCaptor.capture()); assertEquals("新问题", commonQuestionCaptor.getValue().getTitle()); assertEquals("

新内容

", commonQuestionCaptor.getValue().getContentHtml()); } @Test void createShouldRejectBlankTitle() { CommonQuestionSaveRequest request = new CommonQuestionSaveRequest(); request.setTitle(" "); request.setContentHtml("

内容

"); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> commonQuestionAppService.create(request)); assertEquals("请输入问题", exception.getMessage()); } @Test void createShouldRejectTooLongTitle() { CommonQuestionSaveRequest request = new CommonQuestionSaveRequest(); request.setTitle("这是一个超过十五个字的问题标题啊"); request.setContentHtml("

内容

"); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> commonQuestionAppService.create(request)); assertEquals("请输入15个字以内", exception.getMessage()); } @Test void createShouldRejectBlankContent() { CommonQuestionSaveRequest request = new CommonQuestionSaveRequest(); request.setTitle("问题"); request.setContentHtml("


"); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> commonQuestionAppService.create(request)); assertEquals("请输入内容", exception.getMessage()); } @Test void deleteShouldRejectMissingQuestion() { when(commonQuestionMapper.selectOne(any())).thenReturn(null); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> commonQuestionAppService.delete(100L)); assertEquals("常见问题不存在", exception.getMessage()); } }