puzhibing
2026-09-29 010b1028b7121ae37d76441af1df7a2d9f698fc5
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImplTest.java
@@ -3,6 +3,10 @@
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.ruoyi.account.api.feignClient.AppUserWhitelistClient;
import com.ruoyi.account.api.feignClient.ChargingCardClient;
import com.ruoyi.account.api.feignClient.VinManagementClient;
import com.ruoyi.account.api.model.TVinManagement;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.other.api.domain.TGroupCompany;
@@ -78,6 +82,89 @@
        assertEquals(2, detail.getMonthRechargeAmount().scale());
    }
    /**
     * 公司详情(带充电用户聚合)统计 VIN码车辆数量:与 VIN 列表接口同口径,
     * 且聚合充电用户时复用同一远程结果,不重复调用远程接口。
     */
    @Test
    void fillsVinCountAndReusesRemoteVinList() {
        TGroupCompany company = new TGroupCompany();
        company.setId(1);
        company.setAccountMode(1);
        company.setAvailableBalance(new BigDecimal("100.00"));
        TVinManagement vin1 = new TVinManagement();
        vin1.setId(11L);
        vin1.setVin("TESTVIN0001");
        vin1.setBalance(new BigDecimal("10.00"));
        vin1.setStatus(1);
        TVinManagement vin2 = new TVinManagement();
        vin2.setId(12L);
        vin2.setVin("TESTVIN0002");
        vin2.setBalance(new BigDecimal("20.00"));
        vin2.setStatus(1);
        TFleetMapper fleetMapper = Mockito.mock(TFleetMapper.class);
        Mockito.when(fleetMapper.selectCount(Mockito.any())).thenReturn(0L);
        Mockito.when(fleetMapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
        TCompanyRechargeRecordMapper rechargeMapper = Mockito.mock(TCompanyRechargeRecordMapper.class);
        Mockito.when(rechargeMapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
        VinManagementClient vinClient = Mockito.mock(VinManagementClient.class);
        Mockito.when(vinClient.listByCompany(1)).thenReturn(R.ok(Arrays.asList(vin1, vin2)));
        ChargingCardClient cardClient = Mockito.mock(ChargingCardClient.class);
        Mockito.when(cardClient.listByCompany(1)).thenReturn(R.ok(Collections.emptyList()));
        AppUserWhitelistClient whitelistClient = Mockito.mock(AppUserWhitelistClient.class);
        Mockito.when(whitelistClient.listByCompany(1)).thenReturn(R.ok(Collections.emptyList()));
        TGroupCompanyServiceImpl service = buildService(company, fleetMapper, rechargeMapper);
        ReflectionTestUtils.setField(service, "vinManagementClient", vinClient);
        ReflectionTestUtils.setField(service, "chargingCardClient", cardClient);
        ReflectionTestUtils.setField(service, "appUserWhitelistClient", whitelistClient);
        TGroupCompany detail = service.getDetailWithChargingUsers(1);
        assertEquals(2, detail.getVinCount());
        assertEquals(2, detail.getChargingUsers().size());
        // VIN 远程接口仅调用一次:vinCount 统计与充电用户聚合复用同一结果
        Mockito.verify(vinClient, Mockito.times(1)).listByCompany(1);
    }
    /**
     * VIN 远程接口异常降级:vinCount 返回 0,详情主流程不受影响
     */
    @Test
    void vinCountZeroWhenVinRemoteFails() {
        TGroupCompany company = new TGroupCompany();
        company.setId(1);
        company.setAccountMode(1);
        TFleetMapper fleetMapper = Mockito.mock(TFleetMapper.class);
        Mockito.when(fleetMapper.selectCount(Mockito.any())).thenReturn(0L);
        Mockito.when(fleetMapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
        TCompanyRechargeRecordMapper rechargeMapper = Mockito.mock(TCompanyRechargeRecordMapper.class);
        Mockito.when(rechargeMapper.selectList(Mockito.any())).thenReturn(Collections.emptyList());
        VinManagementClient vinClient = Mockito.mock(VinManagementClient.class);
        Mockito.when(vinClient.listByCompany(1)).thenThrow(new RuntimeException("remote down"));
        ChargingCardClient cardClient = Mockito.mock(ChargingCardClient.class);
        Mockito.when(cardClient.listByCompany(1)).thenReturn(R.ok(Collections.emptyList()));
        AppUserWhitelistClient whitelistClient = Mockito.mock(AppUserWhitelistClient.class);
        Mockito.when(whitelistClient.listByCompany(1)).thenReturn(R.ok(Collections.emptyList()));
        TGroupCompanyServiceImpl service = buildService(company, fleetMapper, rechargeMapper);
        ReflectionTestUtils.setField(service, "vinManagementClient", vinClient);
        ReflectionTestUtils.setField(service, "chargingCardClient", cardClient);
        ReflectionTestUtils.setField(service, "appUserWhitelistClient", whitelistClient);
        TGroupCompany detail = service.getDetailWithChargingUsers(1);
        assertEquals(0, detail.getVinCount());
        assertTrue(detail.getChargingUsers().isEmpty());
    }
    @Test
    void returnsNullAndSkipsStatisticsWhenCompanyNotExists() {
        TFleetMapper fleetMapper = Mockito.mock(TFleetMapper.class);