diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index e848d82..0000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.github/.DS_Store b/.github/.DS_Store
deleted file mode 100644
index c29fa0a..0000000
Binary files a/.github/.DS_Store and /dev/null differ
diff --git a/README.md b/README.md
index 68e0616..73eeb7f 100644
--- a/README.md
+++ b/README.md
@@ -30,12 +30,13 @@
 ### 进阶
 
 1. Bean映射工具 :[Bean映射工具之Apache BeanUtils VS Spring BeanUtils](./docs/advanced/Apache-BeanUtils-VS-SpringBean-Utils.md) 、[5种常见Bean映射工具的性能比对](./docs/advanced/Performance-of-Java-Mapping-Frameworks.md)
-3. **[如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!](./docs/advanced/spring-bean-validation.md)**
+3. [如何在 Spring/Spring Boot 中优雅地做参数校验?](./docs/spring-bean-validation.md)
+3. [使用 PowerMockRunner 和 Mockito 编写单元测试用例](./docs/PowerMockRunnerAndMockito.md)
 4. [5分钟搞懂如何在Spring Boot中Schedule Tasks](./docs/advanced/SpringBoot-ScheduleTasks.md) 
-5. **[新手也能看懂的 Spring Boot 异步编程指南](./docs/advanced/springboot-async.md)**
-7. **[Kafka 入门+SpringBoot整合Kafka系列](https://github.com/Snailclimb/springboot-kafka)**
-8. [超详细,新手都能看懂 !使用Spring Boot+Dubbo 搭建一个分布式服务](./docs/advanced/springboot-dubbo.md)
-9. [从零入门 !Spring Security With JWT(含权限验证)](https://github.com/Snailclimb/spring-security-jwt-guide)
+5. [新手也能看懂的 Spring Boot 异步编程指南](./docs/advanced/springboot-async.md)
+6. [Kafka 入门+SpringBoot整合Kafka系列](https://github.com/Snailclimb/springboot-kafka)
+7. [超详细,新手都能看懂 !使用Spring Boot+Dubbo 搭建一个分布式服务](./docs/advanced/springboot-dubbo.md)
+8. [从零入门 !Spring Security With JWT(含权限验证)](https://github.com/Snailclimb/spring-security-jwt-guide)
 
 ### 补充
 
diff --git a/docs/PowerMockRunnerAndMockito.md b/docs/PowerMockRunnerAndMockito.md
new file mode 100644
index 0000000..469e075
--- /dev/null
+++ b/docs/PowerMockRunnerAndMockito.md
@@ -0,0 +1,161 @@
+单元测试可以提高测试开发的效率,减少代码错误率,提高代码健壮性,提高代码质量。在 Spring 框架中常用的两种测试框架:`PowerMockRunner` 和 `SpringRunner` 两个单元测试,鉴于 `SpringRunner` 启动的一系列依赖和数据连接的问题,推荐使用 `PowerMockRunner`,这样能有效的提高测试的效率,并且其提供的 API 能覆盖的场景广泛,使用方便,可谓是 Java 单元测试之模拟利器。
+
+## 1. PowerMock 是什么?
+
+`PowerMock` 是一个 Java 模拟框架,可用于解决通常认为很难甚至无法测试的测试问题。使用 `PowerMock`,可以模拟静态方法,删除静态初始化程序,允许模拟而不依赖于注入,等等。`PowerMock` 通过在执行测试时在运行时修改字节码来完成这些技巧。`PowerMock` 还包含一些实用程序,可让您更轻松地访问对象的内部状态。
+
+举个例子,你在使用 `Junit` 进行单元测试时,并不想让测试数据进入数据库,怎么办?这个时候就可以使用 `PowerMock`,拦截数据库操作,并模拟返回参数。
+
+## 2. PowerMock 包引入
+
+```xml
+
+
+    org.powermock
+    powermock-core
+    2.0.2
+    test
+
+
+  org.mockito
+  mockito-core
+  2.23.0
+
+
+  org.powermock
+  powermock-module-junit4
+  2.0.4
+  test
+
+
+  org.powermock
+  powermock-api-mockito2
+  2.0.2
+  test
+
+
+  com.github.jsonzou
+  jmockdata
+  4.3.0
+
+```
+
+## 3. 重要注解说明
+
+```java
+@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
+@PrepareForTest({RandomUtil.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类
+@PowerMockIgnore("javax.management.*") //为了解决使用powermock后,提示classloader错误
+```
+
+## 4. 使用示例
+
+### 4.1 模拟接口返回
+
+首先对接口进行 mock,然后录制相关行为
+
+```java
+InterfaceToMock mock = Powermockito.mock(InterfaceToMock.class)
+Powermockito.when(mock.method(Params…)).thenReturn(value)
+Powermockito.when(mock.method(Params..)).thenThrow(Exception)
+```
+
+### 4.2 设置对象的 private 属性
+
+需要使用 `Whitebox` 向 class 或者对象中赋值。
+
+如我们已经对接口尽心了 mock,现在需要将此 mock 加入到对象中,可以采用如下方法:
+
+```java
+Whitebox.setInternalState(Object object, String fieldname, Object… value);
+```
+
+其中 object 为需要设置属性的静态类或对象。
+
+### 4.3 模拟构造函数
+
+对于模拟构造函数,也即当出现 `new InstanceClass()` 时可以将此构造函数拦截并替换结果为我们需要的 mock 对象。
+
+注意:使用时需要加入标记:
+
+```java
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ InstanceClass.class })
+@PowerMockIgnore("javax.management.\*")
+
+Powermockito.whenNew(InstanceClass.class).thenReturn(Object value)
+```
+
+##### 4.4 模拟静态方法
+
+模拟静态方法类似于模拟构造函数,也需要加入注释标记。
+
+```java
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ StaticClassToMock.class })
+@PowerMockIgnore("javax.management.\*")
+
+Powermockito.mockStatic(StaticClassToMock.class);
+Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)
+```
+
+##### 4.5 模拟 final 方法
+
+Final 方法的模拟类似于模拟静态方法。
+
+```java
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ FinalClassToMock.class })
+@PowerMockIgnore("javax.management.\*")
+
+Powermockito.mockStatic(FinalClassToMock.class);
+Powermockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value)
+```
+
+### 4.6 模拟静态类
+
+模拟静态类类似于模拟静态方法。
+
+### 4.7 使用 spy 方法避免执行被测类中的成员函数
+
+如被测试类为:TargetClass,想要屏蔽的方法为 targetMethod.
+
+```java
+1) PowerMockito.spy(TargetClass.class);
+
+2) Powemockito.when(TargetClass.targetMethod()).doReturn()
+
+3) 注意加入
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(DisplayMoRelationBuilder.class)
+@PowerMockIgnore("javax.management.*")
+```
+
+### 4.8 参数匹配器
+
+有时我们在处理 `doMethod(Param param)` 时,不想进行精确匹配,这时可以使用 `Mockito` 提供的模糊匹配方式。
+
+如:`Mockito.anyInt()`,`Mockito.anyString()`
+
+### 4.9 处理 public void 型的静态方法
+
+```java
+Powermockito.doNothing.when(T class2mock, String method, … params>
+```
+
+## 5. 单元测试用例可选清单
+
+输入数据验证:这些检查通常可以对输入到应用程序系统中的数据采用。
+
+- 必传项测试
+- 唯一字段值测试
+- 空值测试
+- 字段只接受允许的字符
+- 负值测试
+- 字段限于字段长度规范
+- 不可能的值
+- 垃圾值测试
+- 检查字段之间的依赖性
+- 等效类划分和边界条件测试
+- 错误和异常处理测试单元测试可以提高测试开发的效率,减少代码错误率,提高代码健壮性,提高代码质量。在 Spring 框架中常用的两种测试框架:PowerMockRunner 和 SpringRunner 两个单元测试,鉴于 SpringRunner 启动的一系列依赖和数据连接的问题,推荐使用 PowerMockRunner,这样能有效的提高测试的效率,并且其提供的 API 能覆盖的场景广泛,使用方便,可谓是 Java 单元测试之模拟利器。
\ No newline at end of file
diff --git a/docs/advanced/spring-bean-validation.md b/docs/advanced/spring-bean-validation.md
deleted file mode 100644
index 902220a..0000000
--- a/docs/advanced/spring-bean-validation.md
+++ /dev/null
@@ -1,540 +0,0 @@
-**数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。**
-
-本文结合自己在项目中的实际使用经验,可以说**文章介绍的内容很实用,不了解的朋友可以学习一下,后面可以立马实践到项目上去。**
-
-下面我会通过实例程序演示如何在 Java 程序中尤其是 Spring 程序中优雅地的进行参数验证。
-
-## 基础设施搭建
-
-### 相关依赖
-
-如果开发普通 Java 程序的的话,你需要可能需要像下面这样依赖:
-
-```xml
-   
-            org.hibernate.validator
-            hibernate-validator
-            6.0.9.Final
-   
-   
-             javax.el
-             javax.el-api
-             3.0.0
-     
-     
-            org.glassfish.web
-            javax.el
-            2.2.6
-     
-```
-
-使用 Spring Boot 程序的话只需要`spring-boot-starter-web` 就够了,它的子依赖包含了我们所需要的东西。除了这个依赖,下面的演示还用到了 lombok ,所以不要忘记添加上相关依赖。
-
-```xml
-    
-        
-            org.springframework.boot
-            spring-boot-starter-web
-        
-        
-            org.projectlombok
-            lombok
-            true
-        
-        
-            org.springframework.boot
-            spring-boot-starter-test
-            test
-        
-    
-```
-
-### 实体类
-
-下面这个是示例用到的实体类。
-
-```java
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class Person {
-
-    @NotNull(message = "classId 不能为空")
-    private String classId;
-
-    @Size(max = 33)
-    @NotNull(message = "name 不能为空")
-    private String name;
-
-    @Pattern(regexp = "((^Man$|^Woman$|^UGM$))", message = "sex 值不在可选范围")
-    @NotNull(message = "sex 不能为空")
-    private String sex;
-
-    @Email(message = "email 格式不正确")
-    @NotNull(message = "email 不能为空")
-    private String email;
-
-}
-```
-
-> 正则表达式说明:
->
-> ```
-> - ^string : 匹配以 string 开头的字符串
-> - string$ :匹配以 string 结尾的字符串
-> - ^string$ :精确匹配 string 字符串
-> - ((^Man$|^Woman$|^UGM$)) : 值只能在 Man,Woman,UGM 这三个值中选择
-> ```
-
-下面这部分校验注解说明内容参考自:https://www.cnkirito.moe/spring-validation/ ,感谢@[徐靖峰](https://github.com/lexburner)。
-
-**JSR提供的校验注解**:
-
-
-- `@Null`   被注释的元素必须为 null 
-- `@NotNull`    被注释的元素必须不为 null
-- `@AssertTrue`     被注释的元素必须为 true 
-- `@AssertFalse`    被注释的元素必须为 false 
-- `@Min(value) `    被注释的元素必须是一个数字,其值必须大于等于指定的最小值 
-- `@Max(value) `    被注释的元素必须是一个数字,其值必须小于等于指定的最大值 
-- `@DecimalMin(value) ` 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
-- `@DecimalMax(value)`  被注释的元素必须是一个数字,其值必须小于等于指定的最大值 
-- `@Size(max=, min=) `  被注释的元素的大小必须在指定的范围内 
-- `@Digits (integer, fraction) `    被注释的元素必须是一个数字,其值必须在可接受的范围内 
-- `@Past `  被注释的元素必须是一个过去的日期 
-- `@Future`     被注释的元素必须是一个将来的日期  
-- `@Pattern(regex=,flag=) ` 被注释的元素必须符合指定的正则表达式
-
-
-**Hibernate Validator提供的校验注解**:
-
-
-- `@NotBlank(message =) `  验证字符串非null,且长度必须大于0 
-- `@Email`  被注释的元素必须是电子邮箱地址 
-- `@Length(min=,max=) ` 被注释的字符串的大小必须在指定的范围内 
-- `@NotEmpty `  被注释的字符串的必须非空 
-- `@Range(min=,max=,message=)`  被注释的元素必须在合适的范围内
-
-## 验证Controller的输入
-
-### 验证请求体(RequestBody)
-
-**Controller:**
-
-我们在需要验证的参数上加上了`@Valid`注解,如果验证失败,它将抛出`MethodArgumentNotValidException`。默认情况下,Spring会将此异常转换为HTTP Status 400(错误请求)。
-
-```java
-
-@RestController
-@RequestMapping("/api")
-public class PersonController {
-
-    @PostMapping("/person")
-    public ResponseEntity getPerson(@RequestBody @Valid Person person) {
-        return ResponseEntity.ok().body(person);
-    }
-}
-```
-
-**ExceptionHandler:**
-
-自定义异常处理器可以帮助我们捕获异常,并进行一些简单的处理。如果对于下面的处理异常的代码不太理解的话,可以查看这篇文章 [《SpringBoot 处理异常的几种常见姿势》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485568&idx=2&sn=c5ba880fd0c5d82e39531fa42cb036ac&chksm=cea2474bf9d5ce5dcbc6a5f6580198fdce4bc92ef577579183a729cb5d1430e4994720d59b34&token=1924773784&lang=zh_CN#rd)。
-
-```java
-@ControllerAdvice(assignableTypes = {PersonController.class})
-public class GlobalExceptionHandler {
-    @ExceptionHandler(MethodArgumentNotValidException.class)
-    public ResponseEntity