package com.ruoyi.other.service.impl; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.TGroupCompany; import com.ruoyi.other.api.dto.CompanyRechargeRecordExcelDTO; import com.ruoyi.other.api.dto.CompanyRechargeRecordQueryDTO; import com.ruoyi.other.api.model.TCompanyRechargeRecord; import com.ruoyi.other.mapper.TCompanyRechargeRecordMapper; import com.ruoyi.other.mapper.TGroupCompanyMapper; import com.ruoyi.other.service.CompanyAccountAccessService; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.test.util.ReflectionTestUtils; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; /** * 公司充值记录 服务实现类 单测:覆盖充值流水号生成、状态默认值、公司隔离、名称回填、Excel DTO 映射。 */ class TCompanyRechargeRecordServiceImplTest { @BeforeAll static void initTableInfo() { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), TCompanyRechargeRecord.class); } @Test void rechargeGeneratesSerialNoAndSetsStatusSuccess() { TGroupCompany company = new TGroupCompany(); company.setId(100); company.setName("M公司"); TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class); Mockito.when(groupCompanyMapper.selectById(100)).thenReturn(company); TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class); Mockito.when(mapper.insert(any())).thenAnswer(invocation -> { TCompanyRechargeRecord r = invocation.getArgument(0); r.setId(555); return 1; }); CompanyAccountAccessService access = Mockito.mock(CompanyAccountAccessService.class); SysUserClient userClient = Mockito.mock(SysUserClient.class); TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl(); ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper); ReflectionTestUtils.setField(service, "companyAccountAccessService", access); ReflectionTestUtils.setField(service, "sysUserClient", userClient); ReflectionTestUtils.setField(service, "baseMapper", mapper); TCompanyRechargeRecord in = new TCompanyRechargeRecord(); in.setCompanyId(100); in.setPayAmount(new BigDecimal("1000.00")); in.setGiftAmount(new BigDecimal("200.00")); Integer newId = service.recharge(in); assertEquals(555, newId); assertEquals(1, in.getStatus()); assertNotNull(in.getSerialNo()); assertTrue(in.getSerialNo().startsWith("CR")); assertEquals(LocalDateTime.now().toLocalDate(), in.getRechargeTime().toLocalDate()); assertEquals(new BigDecimal("1200.00"), in.getArrivalAmount()); // 验证公司余额原子加 setSql 触发 Mockito.verify(groupCompanyMapper, Mockito.times(1)) .update(eq(null), any()); } @Test void rechargeFailsWhenCompanyNotExists() { TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class); Mockito.when(groupCompanyMapper.selectById(999)).thenReturn(null); TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class); CompanyAccountAccessService access = Mockito.mock(CompanyAccountAccessService.class); SysUserClient userClient = Mockito.mock(SysUserClient.class); TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl(); ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper); ReflectionTestUtils.setField(service, "companyAccountAccessService", access); ReflectionTestUtils.setField(service, "sysUserClient", userClient); ReflectionTestUtils.setField(service, "baseMapper", mapper); TCompanyRechargeRecord in = new TCompanyRechargeRecord(); in.setCompanyId(999); in.setPayAmount(new BigDecimal("100")); IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> service.recharge(in)); assertTrue(ex.getMessage().contains("公司不存在")); Mockito.verifyNoInteractions(mapper); } @Test @SuppressWarnings({"rawtypes", "unchecked"}) void pageListAppliesCompanyFilterAndFillsNames() { TCompanyRechargeRecord r1 = new TCompanyRechargeRecord(); r1.setId(1); r1.setCompanyId(100); r1.setOperatorId(9001L); r1.setPayAmount(new BigDecimal("100")); TCompanyRechargeRecord r2 = new TCompanyRechargeRecord(); r2.setId(2); r2.setCompanyId(200); r2.setOperatorId(9002L); r2.setPayAmount(new BigDecimal("50")); Page pageResult = new Page(1, 10); pageResult.setRecords(Arrays.asList(r1, r2)); pageResult.setTotal(2L); TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class); Mockito.when(mapper.selectPage(any(Page.class), any())).thenReturn(pageResult); TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class); TGroupCompany c1 = new TGroupCompany(); c1.setId(100); c1.setName("A公司"); TGroupCompany c2 = new TGroupCompany(); c2.setId(200); c2.setName("B公司"); Mockito.when(groupCompanyMapper.selectBatchIds(any())).thenReturn(Arrays.asList(c1, c2)); SysUserClient userClient = Mockito.mock(SysUserClient.class); SysUser u1 = new SysUser(); u1.setUserId(9001L); u1.setUserName("张三"); SysUser u2 = new SysUser(); u2.setUserId(9002L); u2.setUserName("李四"); Mockito.when(userClient.getSysUser(9001L)).thenReturn(R.ok(u1)); Mockito.when(userClient.getSysUser(9002L)).thenReturn(R.ok(u2)); CompanyAccountAccessService access = Mockito.mock(CompanyAccountAccessService.class); // 当前请求携带 companyId=null,且当前账号非公司账号 → resolveCompanyFilter 返回 null(不限) Mockito.when(access.resolveCompanyFilter(null)).thenReturn(null); TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl(); ReflectionTestUtils.setField(service, "baseMapper", mapper); ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper); ReflectionTestUtils.setField(service, "sysUserClient", userClient); ReflectionTestUtils.setField(service, "companyAccountAccessService", access); CompanyRechargeRecordQueryDTO query = new CompanyRechargeRecordQueryDTO(); query.setCurrent(1); query.setSize(10); com.ruoyi.common.core.web.page.PageInfo page = service.pageList(query); assertEquals(2L, page.getTotal()); assertEquals(2, page.getRecords().size()); assertEquals("A公司", page.getRecords().get(0).getCompanyName()); assertEquals("张三", page.getRecords().get(0).getOperatorName()); assertEquals("B公司", page.getRecords().get(1).getCompanyName()); assertEquals("李四", page.getRecords().get(1).getOperatorName()); } @Test @SuppressWarnings("unchecked") void selectExportListMapsToExcelDto() { TCompanyRechargeRecord r1 = new TCompanyRechargeRecord(); r1.setId(1); r1.setSerialNo("CR20260930101500001"); r1.setCompanyId(100); r1.setPayAmount(new BigDecimal("100")); r1.setGiftAmount(new BigDecimal("20")); r1.setArrivalAmount(new BigDecimal("120")); r1.setStatus(1); r1.setOperatorId(9001L); r1.setCompanyName("A公司"); r1.setOperatorName("张三"); r1.setRechargeTime(LocalDateTime.of(2026, 9, 30, 10, 15, 0)); TCompanyRechargeRecordMapper mapper = Mockito.mock(TCompanyRechargeRecordMapper.class); Mockito.when(mapper.selectList(any())).thenReturn(Collections.singletonList(r1)); // fillNames 会重新覆盖 companyName/operatorName,必须 stub 远程查询 TGroupCompanyMapper groupCompanyMapper = Mockito.mock(TGroupCompanyMapper.class); TGroupCompany c1 = new TGroupCompany(); c1.setId(100); c1.setName("A公司"); Mockito.when(groupCompanyMapper.selectBatchIds(any())).thenReturn(Collections.singletonList(c1)); SysUserClient userClient = Mockito.mock(SysUserClient.class); SysUser u1 = new SysUser(); u1.setUserId(9001L); u1.setUserName("张三"); Mockito.when(userClient.getSysUser(9001L)).thenReturn(R.ok(u1)); TCompanyRechargeRecordServiceImpl service = new TCompanyRechargeRecordServiceImpl(); ReflectionTestUtils.setField(service, "baseMapper", mapper); ReflectionTestUtils.setField(service, "groupCompanyMapper", groupCompanyMapper); ReflectionTestUtils.setField(service, "sysUserClient", userClient); ReflectionTestUtils.setField(service, "companyAccountAccessService", Mockito.mock(CompanyAccountAccessService.class)); CompanyRechargeRecordQueryDTO query = new CompanyRechargeRecordQueryDTO(); query.setStatus(1); List list = service.selectExportList(query); assertEquals(1, list.size()); CompanyRechargeRecordExcelDTO dto = list.get(0); assertEquals("CR20260930101500001", dto.getSerialNo()); assertEquals("A公司", dto.getCompanyName()); assertEquals(new BigDecimal("120"), dto.getArrivalAmount()); assertEquals(1, dto.getStatus()); assertEquals("张三", dto.getOperatorName()); assertNotEquals(null, dto.getRechargeTime()); } }