当前位置: 首页 > wzjs >正文

网站泛解析wordpress 缓存用什么

网站泛解析,wordpress 缓存用什么,2024年最新一轮阳性症状,系统首页设计图一、JUnit 详解 1. JUnit 核心概念 ​​测试类​​:以 Test 结尾的类(或通过 Test 注解标记的方法)。​​断言(Assertions)​​:验证预期结果与实际结果是否一致(如 assertEquals()&#xff0…

一、JUnit 详解

1. JUnit 核心概念

  • ​测试类​​:以 Test 结尾的类(或通过 @Test 注解标记的方法)。
  • ​断言(Assertions)​​:验证预期结果与实际结果是否一致(如 assertEquals())。
  • ​测试生命周期​​:通过注解管理测试的初始化和清理(如 @BeforeEach@AfterEach)。
  • ​参数化测试​​:针对多组输入数据运行同一测试逻辑(JUnit 5+)。

2. JUnit 5 示例

(1) 基础测试
java
复制
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;class CalculatorTest {@Testvoid testAdd() {Calculator calculator = new Calculator();assertEquals(5, calculator.add(2, 3), "2+3 应等于 5");}@Testvoid testDivideByZero() {Calculator calculator = new Calculator();assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));}
}
(2) 生命周期管理
java
复制
import org.junit.jupiter.api.*;class LifecycleTest {@BeforeEachvoid setup() {System.out.println("每个测试方法执行前运行");}@AfterEachvoid teardown() {System.out.println("每个测试方法执行后运行");}@Testvoid test1() {System.out.println("运行测试1");}@Testvoid test2() {System.out.println("运行测试2");}
}
(3) 参数化测试
java
复制
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;class ParameterizedTest {@ParameterizedTest@CsvSource({"2, 3, 5", "5, 7, 12", "-1, 1, 0"})void testAdd(int a, int b, int expected) {Calculator calculator = new Calculator();assertEquals(expected, calculator.add(a, b));}
}

二、Mockito 详解

1. Mockito 核心概念

  • ​模拟对象(Mock)​​:通过 @Mock 或 mock() 创建,隔离外部依赖。
  • ​注入依赖​​:使用 @InjectMocks 自动注入模拟对象到被测类。
  • ​验证行为​​:通过 verify() 检查方法是否按预期调用。
  • ​定义返回值​​:使用 when().thenReturn() 模拟方法行为。

2. Mockito 示例

(1) 基础模拟
java
复制
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;// 被测类
class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(int id) {return userRepository.findById(id);}
}// 模拟依赖
interface UserRepository {User findById(int id);
}class UserServiceTest {@Testvoid testGetUserById() {// 1. 创建模拟对象UserRepository mockUserRepository = mock(UserRepository.class);// 2. 定义模拟行为when(mockUserRepository.findById(1)).thenReturn(new User(1, "Alice"));// 3. 注入模拟对象到被测类UserService userService = new UserService(mockUserRepository);// 4. 执行测试User user = userService.getUserById(1);// 5. 验证结果assertEquals("Alice", user.getName());verify(mockUserRepository).findById(1); // 确认方法被调用}
}
(2) 验证调用次数
java
复制
@Test
void testSaveUser() {UserRepository mockUserRepository = mock(UserRepository.class);UserService userService = new UserService(mockUserRepository);userService.saveUser(new User(2, "Bob"));userService.saveUser(new User(3, "Charlie"));// 验证 save 方法被调用了两次verify(mockUserRepository, times(2)).save(any(User.class));
}
(3) 模拟异常场景
java
复制
@Test
void testUserNotFound() {UserRepository mockUserRepository = mock(UserRepository.class);UserService userService = new UserService(mockUserRepository);when(mockUserRepository.findById(99)).thenThrow(new RuntimeException("User not found"));assertThrows(RuntimeException.class, () -> userService.getUserById(99));
}

三、Mockito 高级用法

1. Spy 对象

  • ​部分模拟​​:真实对象的部分方法被监控,其余方法正常执行。
java
复制
@Test
void testSpy() {List<String> list = new ArrayList<>();List<String> spyList = spy(list);doNothing().when(spyList).clear(); // 监控 clear() 方法spyList.add("test");verify(spyList).add("test"); // 验证 add() 被调用spyList.clear(); // 实际调用真实方法
}

2. ArgumentCaptor 捕获参数

  • ​捕获方法参数​​:验证方法调用时传入的参数。
java
复制
@Test
void testCaptureArgument() {UserRepository mockUserRepository = mock(UserRepository.class);UserService userService = new UserService(mockUserRepository);userService.saveUser(new User(4, "David"));ArgumentCaptor<User> userCaptor = ArgumentCaptor.forClass(User.class);verify(mockUserRepository).save(userCaptor.capture());User capturedUser = userCaptor.getValue();assertEquals(4, capturedUser.getId());
}

四、JUnit 与 Mockito 结合实战

场景:测试订单服务(依赖数据库和外部 API)

java
复制
// 被测类
class OrderService {private OrderRepository orderRepository;private PaymentGateway paymentGateway;public OrderService(OrderRepository orderRepository, PaymentGateway paymentGateway) {this.orderRepository = orderRepository;this.paymentGateway = paymentGateway;}public Order createOrder(OrderRequest request) {// 1. 保存订单到数据库Order order = orderRepository.save(request.toOrder());// 2. 调用支付网关paymentGateway.charge(order.getId(), order.getAmount());return order;}
}// 测试类
class OrderServiceTest {@Testvoid testCreateOrder() {// 1. 模拟依赖OrderRepository mockRepo = mock(OrderRepository.class);PaymentGateway mockGateway = mock(PaymentGateway.class);// 2. 定义模拟行为when(mockRepo.save(any(Order.class))).thenAnswer(invocation -> invocation.getArgument(0));doNothing().when(mockGateway).charge(anyInt(), anyDouble());// 3. 注入依赖并测试OrderService orderService = new OrderService(mockRepo, mockGateway);OrderRequest request = new OrderRequest(1001, 99.9);Order order = orderService.createOrder(request);// 4. 验证流程verify(mockRepo).save(argThat(o -> o.getUserId() == 1001));verify(mockGateway).charge(order.getId(), 99.9);}
}

五、常见问题与解决

1. ​​Mockito 无法模拟静态方法(JUnit 5)​

  • ​原因​​:Mockito 默认不支持静态方法模拟。
  • ​解决​​:使用 mockito-inline 库并启用静态模拟:
    java
    复制
    @ExtendWith(MockitoExtension.class)
    class MyTest {@Testvoid testStaticMethod() {try (MockedStatic<StaticClass> mocked = mockStatic(StaticClass.class)) {mocked.when(StaticClass.staticMethod()).thenReturn("mocked");// 执行测试...}}
    }

2. ​​测试覆盖率低​

  • ​工具​​:使用 JaCoCo 或 Cobertura 生成覆盖率报告。
  • ​优化​​:确保测试覆盖正常路径、边界条件和异常场景。

六、总结

  • ​JUnit​​:核心是编写可重复的自动化测试,通过断言验证逻辑正确性。
  • ​Mockito​​:通过模拟依赖隔离被测对象,支持复杂场景的单元测试。
  • ​最佳实践​​:
    • 测试粒度小,聚焦单一功能。
    • 使用 @BeforeEach 初始化测试环境。
    • 避免过度模拟,优先测试真实逻辑。

​应用场景​​:

  • ​JUnit​​:所有单元测试的基础框架。
  • ​Mockito​​:依赖外部服务或复杂对象的场景(如数据库、API 调用)。

文章转载自:

http://quud6GQw.tdnbw.cn
http://DFd8GKSR.tdnbw.cn
http://UaPTeNcV.tdnbw.cn
http://lVLE7tbg.tdnbw.cn
http://C3oX6ch0.tdnbw.cn
http://h3KYpdYl.tdnbw.cn
http://kwLL7OxJ.tdnbw.cn
http://Q6OjTmuj.tdnbw.cn
http://QW3L2AeT.tdnbw.cn
http://Keu2aSu7.tdnbw.cn
http://Tdi5DWeQ.tdnbw.cn
http://tVCGvJg7.tdnbw.cn
http://dRAjBX8x.tdnbw.cn
http://GwLghbgK.tdnbw.cn
http://d7yua64W.tdnbw.cn
http://AiKgX58B.tdnbw.cn
http://gfB0nKKJ.tdnbw.cn
http://bJHoEagi.tdnbw.cn
http://oWvO9Sg0.tdnbw.cn
http://Yr84t5qF.tdnbw.cn
http://hoo7eM5J.tdnbw.cn
http://FeMleXvs.tdnbw.cn
http://KQAGBuBL.tdnbw.cn
http://riupWP3J.tdnbw.cn
http://lb3f8pRV.tdnbw.cn
http://VQy25Ab4.tdnbw.cn
http://GT1NtyAB.tdnbw.cn
http://2OdpkzCl.tdnbw.cn
http://vcixa0Th.tdnbw.cn
http://ylMOsjvR.tdnbw.cn
http://www.dtcms.com/wzjs/733505.html

相关文章:

  • 人才网站怎么做学校网站群管理系统建设项目
  • 微网站页面网络运维工程师考试
  • 西安自助建站系统网站建设html代码
  • 网站建设合同 下载怎么制作公众号视频
  • 南京移动网站建设wordpress auth_key
  • 湖北网站建设网址wordpress什么编辑器好用
  • 惠州企业网站建设选哪家域名查询ip
  • 聊城开发区建设局网站好看的网站色彩搭配
  • 南京的电商网站设计摄影网站源代码
  • 网站 手机 微信 app外包软件公司在哪里去接项目
  • 山东省建设备案网站审批表会用框架做网站能找到工作吗
  • 北京网站优化推广分析免费咨询法律援助电话号码
  • 网站建设可视化工具美食网站的设计与实现
  • 建设家具网站的目的及功能定位色无极网站正在建设中
  • php网站建设原码网站还建设 域名可以备案吗
  • 网站如何解析返利网站怎么做
  • 如何在税局网站上做税种认定wordpress视差插件
  • 湖南网站建设策划安卓应用市场app下载安装
  • 想学做网站学那个软件好三星商城app下载
  • 营销型网站建设模板微软 网站开发
  • 陕西交通建设集团西商分公司网站设计师找工作的网站
  • 门户网站产品设计方案做问卷的网站好
  • 免费的行情网站appled营销型网站建设
  • 南山网站建设哪家便宜做动漫网站的素材
  • 干事儿网网站开发手机软件商店免费下载
  • 福州市建设局内部网站国内做网站网站风险大吗
  • 网站后台seo优化如何做国外优秀平面设计网站
  • 简答题网站建设步骤汕头seo代理
  • 网站对联模板查询网站备案密码
  • 苏州艺术家网站建设用了wordpress的电商网站