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.ActivityNoticeCreateRequest; import com.tcm.training.admin.system.entity.ActivityNotice; import com.tcm.training.admin.system.event.ActivityNoticeCreatedEvent; import com.tcm.training.admin.system.mapper.ActivityNoticeMapper; import com.tcm.training.admin.system.vo.ActivityNoticeListItemVO; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.springframework.context.ApplicationEventPublisher; 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 ActivityNoticeAppServiceTest { @BeforeAll static void initLambdaCache() { MapperBuilderAssistant assistant = new MapperBuilderAssistant(new MybatisConfiguration(), ""); TableInfoHelper.initTableInfo(assistant, ActivityNotice.class); } @Mock private ActivityNoticeMapper activityNoticeMapper; @Mock private ActivityNoticeDispatchService activityNoticeDispatchService; @Mock private ApplicationEventPublisher applicationEventPublisher; @InjectMocks private ActivityNoticeAppService activityNoticeAppService; @Captor private ArgumentCaptor activityNoticeCaptor; @Captor private ArgumentCaptor eventCaptor; @Test void createShouldTrimTitleAndPersistContent() { doAnswer(invocation -> { ActivityNotice item = invocation.getArgument(0); item.setId(1L); return 1; }).when(activityNoticeMapper).insert(any(ActivityNotice.class)); ActivityNotice persisted = new ActivityNotice(); persisted.setId(1L); persisted.setTitle("春季活动"); persisted.setContentHtml("

活动内容

"); persisted.setCreatedAt(LocalDateTime.of(2026, 3, 26, 18, 10, 0)); when(activityNoticeMapper.selectOne(any())).thenReturn(persisted); ActivityNoticeCreateRequest request = new ActivityNoticeCreateRequest(); request.setTitle(" 春季活动 "); request.setContentHtml("

活动内容

"); ActivityNoticeListItemVO result = activityNoticeAppService.create(request); verify(activityNoticeMapper).insert(activityNoticeCaptor.capture()); verify(applicationEventPublisher).publishEvent(eventCaptor.capture()); assertEquals("春季活动", activityNoticeCaptor.getValue().getTitle()); assertEquals("

活动内容

", activityNoticeCaptor.getValue().getContentHtml()); assertEquals(Long.valueOf(1L), eventCaptor.getValue().getActivityNoticeId()); assertEquals("春季活动", result.getTitle()); } @Test void createShouldRejectBlankRichTextContent() { ActivityNoticeCreateRequest request = new ActivityNoticeCreateRequest(); request.setTitle("活动标题"); request.setContentHtml("


"); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> activityNoticeAppService.create(request)); assertEquals("请输入通知内容", exception.getMessage()); } }