//package com.greenorange.promotion.junit; // //import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; //import com.greenorange.promotion.model.dto.CommonBatchRequest; //import com.greenorange.promotion.model.entity.PromoCode; //import com.greenorange.promotion.service.project.impl.PromoCodeServiceImpl; //import org.junit.jupiter.api.Test; //import org.junit.jupiter.api.extension.ExtendWith; //import org.mockito.InjectMocks; //import org.mockito.Spy; //import org.mockito.junit.jupiter.MockitoExtension; // //import java.util.Arrays; //import java.util.Collections; //import java.util.List; // //import static org.junit.jupiter.api.Assertions.assertThrows; //import static org.junit.jupiter.api.Assertions.assertTrue; //import static org.mockito.Mockito.*; // //@ExtendWith(MockitoExtension.class) //class PromoCodeServiceImplTest { // // @Spy // @InjectMocks // private PromoCodeServiceImpl service; // // Spy + InjectMocks:使用真实的 PromoCodeServiceImpl,但可以 stub 它的 list(...) 和 removeByIds(...) // // /** // * 当存在状态为“占用”的推广码时,应抛出异常并且不执行删除 // */ // @Test // void delBatchPromoCode_whenCodesInUse_shouldThrow() { // // Arrange // List ids = Arrays.asList(1L, 2L, 3L); // CommonBatchRequest req = new CommonBatchRequest(); // req.setIds(ids); // // // 模拟 list(...) 返回一个非空列表,表示有正在使用的推广码 // PromoCode inUse = new PromoCode(); // inUse.setId(2L); // inUse.setPromoCodeStatus(true); // doReturn(Collections.singletonList(inUse)) // .when(service).list(any(LambdaQueryWrapper.class)); // // // Act & Assert // RuntimeException ex = assertThrows(RuntimeException.class, // () -> service.delBatchPromoCode(req)); // assertTrue(ex.getMessage().contains("当前推广码正在使用中")); // // // 验证 removeByIds(...) 从未被调用 // verify(service, never()).removeByIds(anyList()); // } // // /** // * 当所有推广码都未被占用时,应正常调用 removeByIds 删除 // */ // @Test // void delBatchPromoCode_whenNoCodesInUse_shouldRemove() { // // Arrange // List ids = Arrays.asList(4L, 5L); // CommonBatchRequest req = new CommonBatchRequest(); // req.setIds(ids); // // // 模拟 list(...) 返回空列表,表示无任何占用的推广码 // doReturn(Collections.emptyList()) // .when(service).list(any(LambdaQueryWrapper.class)); // // // 模拟 removeByIds(...) 返回 true,表示删除成功 // doReturn(true).when(service).removeByIds(ids); // // // Act // service.delBatchPromoCode(req); // // // Assert // // 验证 removeByIds(...) 被调用一次,且参数正是传入的 ids // verify(service, times(1)).removeByIds(ids); // } //}