//package com.greenorange.promotion.junit; // //import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest; //import com.greenorange.promotion.model.entity.UserAccount; //import com.greenorange.promotion.service.common.CommonService; //import com.greenorange.promotion.service.settle.impl.UserAccountServiceImpl; //import jakarta.servlet.http.HttpServletRequest; //import org.junit.jupiter.api.Test; //import org.junit.jupiter.api.extension.ExtendWith; //import org.mockito.ArgumentCaptor; //import org.mockito.InjectMocks; //import org.mockito.Mock; //import org.mockito.Spy; //import org.mockito.junit.jupiter.MockitoExtension; // //import static org.junit.jupiter.api.Assertions.assertEquals; //import static org.junit.jupiter.api.Assertions.assertSame; //import static org.mockito.Mockito.*; // //@ExtendWith(MockitoExtension.class) //class UserAccountServiceImplTest { // // @Spy // @InjectMocks // private UserAccountServiceImpl userAccountService; // // Spy + InjectMocks:用真实的 serviceImpl,但可以对它的方法做部分 stub // // @Mock // private CommonService commonService; // // Mock CommonService,用于模拟 copyProperties // // @Mock // private HttpServletRequest request; // // Mock HttpServletRequest,用于模拟获取 userId // // @Test // void updateUserAccount_shouldCopyProperties_setUserId_andUpdateById() { // // --- Arrange 准备阶段 --- // Long userId = 456L; // // 模拟从 request 中拿到当前登录用户 ID // when(request.getAttribute("userId")).thenReturn(userId); // // // 构造更新请求 DTO,并设置要更新的账户 ID // UserAccountUpdateRequest req = new UserAccountUpdateRequest(); // req.setId(99L); // req.setCardHolder("李四"); // req.setIdCardNumber("110101199002022345"); // req.setPhoneNumber("15900001111"); // req.setBankCardNumber("6222020202020202"); // req.setOpenBank("中国农业银行"); // // // 准备一个空实体,模拟 commonService.copyProperties 拷贝结果 // UserAccount stubEntity = new UserAccount(); // // 假设 copyProperties 会拷贝所有字段,包括 id // stubEntity.setId(req.getId()); // stubEntity.setCardHolder(req.getCardHolder()); // stubEntity.setIdCardNumber(req.getIdCardNumber()); // stubEntity.setPhoneNumber(req.getPhoneNumber()); // stubEntity.setBankCardNumber(req.getBankCardNumber()); // stubEntity.setOpenBank(req.getOpenBank()); // // stub copyProperties 返回我们准备的 stubEntity // when(commonService.copyProperties(req, UserAccount.class)) // .thenReturn(stubEntity); // // // 对 Spy 的 updateById(...) 方法做 stub,避免走到 MyBatis-Plus 真逻辑 // doReturn(true).when(userAccountService).updateById(any(UserAccount.class)); // // // --- Act 执行阶段 --- // userAccountService.updateUserAccount(req, request); // // 方法内部执行顺序: // // 1. 取 request.getAttribute("userId") -> 456L // // 2. commonService.copyProperties(req, UserAccount.class) -> stubEntity // // 3. stubEntity.setUserId(456L) // // 4. 调用 updateById(stubEntity) // // // --- Assert 验证阶段 --- // // 捕获 updateById 调用时传入的参数 // ArgumentCaptor captor = ArgumentCaptor.forClass(UserAccount.class); // verify(userAccountService).updateById(captor.capture()); // UserAccount updated = captor.getValue(); // // // 验证传给 updateById 的正是 stubEntity 对象 // assertSame(stubEntity, updated, "应该传入同一个 stubEntity 实例"); // // // 验证 userId 已正确赋值 // assertEquals(userId, updated.getUserId(), "userId 应该从 request 中取出并赋值"); // // // 验证其他字段都被 copyProperties 拷贝过来,包括账户 ID // assertEquals(req.getId(), updated.getId(), "账户 ID 应保持一致"); // assertEquals("李四", updated.getCardHolder(), "持卡人应一致"); // assertEquals("110101199002022345", updated.getIdCardNumber(), "身份证号应一致"); // assertEquals("15900001111", updated.getPhoneNumber(), "手机号应一致"); // assertEquals("6222020202020202", updated.getBankCardNumber(),"银行卡号应一致"); // assertEquals("中国农业银行", updated.getOpenBank(), "开户银行应一致"); // } //}