# 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)