# springboot-powermock
**Repository Path**: lgtnliu/springboot-powermock
## Basic Information
- **Project Name**: springboot-powermock
- **Description**: 使用springBoot练习使用PowerMock
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2022-02-16
- **Last Updated**: 2022-02-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringBoot-PowerMock
> 练习使用PowerMock
-- --
# 参考网址
- [直接使用mock](https://www.jianshu.com/p/047cad514d3e)
> 直接进行全部依赖mock,不使用Spring内存中的真实对象(屏蔽掉真实环境)
- [使用真实对象mock](https://blog.csdn.net/qq_35641192/article/details/83867022)
> 类比外部接口或者其他,可以真实的调用方法进行验证,及时发现问题
-- --
### 1、添加maven配置
> 添加mockito和powerMock的依赖,注意版本和SpringBoot配套
```
org.powermock
powermock-module-junit4
${powermock.version}
org.powermock
powermock-api-mockito2
${powermock.version}
org.mockito
mockito-core
${mockito.version}
```
-- --
### 2、创建静态方法
```
@PrepareForTest({StringUtil.class})
public class PowerMock01StaticClass extends BaseMockitoTest {
@Test
public void test静态方法模拟() {
// MOCK
PowerMockito.mockStatic(StringUtil.class);
PowerMockito.when(StringUtil.isEmpty(anyString())).thenReturn(true);
// VERIFY-VALUE
boolean empty = StringUtil.isEmpty("1111");
assertEquals(true, empty);
}
}
```
-- --
### 3、创建私有方法
```
public void test私有非静态方法模拟() throws InvocationTargetException, IllegalAccessException {
// MOCK-非静态方法
StringUtil stringUtil = new StringUtil();
Method isEmptyMethod = PowerMockito.method(StringUtil.class, "isEmptyOrNot", String.class);
Boolean invokeFlag = (boolean) isEmptyMethod.invoke(stringUtil, "1111");
// VERIFY-VALUE
assertEquals("私有非静态方法结果:", false, invokeFlag);
}
@Test
public void test私有静态方法模拟() throws InvocationTargetException, IllegalAccessException {
// MOCK-静态方法
Method isEmptyMethod = PowerMockito.method(StringUtil.class, "isEmpty", String.class);
PowerMockito.mockStatic(StringUtil.class);
Boolean invokeFlag = (boolean) isEmptyMethod.invoke(StringUtil.class, "1111");
// VERIFY-VALUE
assertEquals("私有静态方法结果:", false, invokeFlag);
}
```
-- --
### 4、辅导知识点
- 测试方法和被测类应该在同一个包,方便测试默认权限的方法
- 被测方法至少需要包级私有权限->编写代码的时候应该考虑到测试的权限要求
- 单元测试应该只测试被测方法本身
- 如果被测方法A还调用了其他复杂方法B【说明一下:B应该是外部方法,不能是自己的方法,然后在自己的方法中再调用数据源】
- 那么还应该先对B进行单元测试,然后在A中的测试中对B进行Spy或者Mock
- 如果方法太长,重复代码太多,是必须要进行代码重构的
- 被测的方法应该足够小,否则要进行重构,建议一个方法不超过25行,这样才方便进行测试【程序不具备可测试性】
- 单元测试的目的之一:可以促使我们写出更优化的代码
- 可以为[新增]或者[修改]的代码添加测试用例
- 没有涉及的旧代码可以暂时先不补充,后续找专门的时间进行补充
- 应该避免在整个程序写完并且手动测试以后才补充单元测试方法,因为会太浪费时间
- 正确做法:写程序的时候同步增加测试(写几行代码,就加几行测试,每过几分钟,就要跑一次单元测试)
- 从而使测试和生产代码变成一个整体过程,而不是明显的两大步骤
- 测试方法的命名应该写明测试意图,建议用"当XXXX则XXXX"来写,可以使用中文
- 尽量少用PowerMock,应该通过优化程序(正确使用staic,使用依赖注入或者工厂方法来避免程序中直接new对象)来避免powermock
- 只有在不得已的情况下才使用PowerMock
- 测试方法必须包含验证的步骤(assert/verify)