`
kanpiaoxue
  • 浏览: 1747124 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PowerMockit常用

 
阅读更多

 

文档: http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html

 

1、测试 void 方法

@Autowired
    private JdbcTemplate jdbcTemplate;
    public static final String DELETE_INSTANCE_RELY_BY_TASK = " DELETE FROM tb_instance_rely_rel    "
            + "WHERE task_id=? AND instance_id IN (    SELECT c.instance_id    FROM     "
            + "(SELECT task_id     FROM tb_task    WHERE task_id=?    )a     JOIN    tb_data_version b   "
            + " ON a.task_id =  "
            + " b.task_id     JOIN    tb_instance c    ON b.version_id = c.version_id    WHERE c.state=?    )";


    @Override
    public void deleteInitializedInstanceRelyByTask(long taskId, long upTaskId) {

        final Object[] args = { upTaskId, taskId, InstanceState.INITIALIZED.getValue() };

        LOGGER.debug(Tools.getSqlArgsString(DELETE_INSTANCE_RELY_BY_TASK, args));
        jdbcTemplate.update(DELETE_INSTANCE_RELY_BY_TASK, args);
    }

 

测试代码片段:

  private JdbcTemplate jdbcTemplate;
    private InstanceRelyRelDaoImpl impl;
    private long taskId = 100L;
    private long upTaskId = 101L;

    @Before
    public void before() {
        jdbcTemplate = mock(JdbcTemplate.class);
        impl = new InstanceRelyRelDaoImpl();

        Whitebox.setInternalState(impl, "jdbcTemplate", jdbcTemplate);
    }

    public void testDeleteInitializedInstanceRelyByTask() {
        impl.deleteInitializedInstanceRelyByTask(taskId, upTaskId);
        Object[] args = { upTaskId, taskId, InstanceState.INITIALIZED.getValue() };
        Mockito.verify(jdbcTemplate).update(InstanceRelyRelDaoImpl.DELETE_INSTANCE_RELY_BY_TASK, args);
    }

 

2、测试static 静态方法

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;



import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.KeyHolder;

import java.util.Date;

@RunWith(PowerMockRunner.class) // mock静态方法,必须有
@PrepareForTest({ Utils.class }) // mock静态方法,必须有
public class EntitySubscribeFlowDaoImplTest {
    private EntitySubscribeFlowDaoImpl impl;
    private JdbcTemplate jdbcTemplate;

    @Before
    public void before() {
        impl = new EntitySubscribeFlowDaoImpl();
        jdbcTemplate = mock(JdbcTemplate.class);
        Whitebox.setInternalState(impl, "jdbcTemplate", jdbcTemplate);
    }

    /**
     * Test method
     */
    @Test
    public void testAddEntitySubscribeFlow() {
        try {
            impl.addEntitySubscribeFlow(null);
            fail();
        } catch (Exception e) {
            assertTrue(true);
        }
        try {
            EntitySubscribeFlow flow = new EntitySubscribeFlow();
            KeyHolder keyHolder = mock(KeyHolder.class);
            mockStatic(Utils.class); // mock静态方法,必须有
            when(Utils.createKeyHolder()).thenReturn(keyHolder); // mock静态方法,必须有
            when(keyHolder.getKey()).thenReturn(10L);
            long id = impl.addEntitySubscribeFlow(flow);
            Mockito.verify(jdbcTemplate).update(Mockito.any(PreparedStatementCreator.class),
                    Mockito.any(KeyHolder.class));
            System.err.println("================= " + id);
        } catch (Exception e) {
            e.printStackTrace();
            fail();
        }
    }



}

  

3、mock 掉方法中的 private 私有方法

参考地址: http://automationrhapsody.com/mock-private-method-call-powermock/

 

public class PowerMockDemo {
 
    public Point callPrivateMethod() {
        return privateMethod(new Point(1, 1));
    }
 
    private Point privateMethod(Point point) {
        return new Point(point.getX() + 1, point.getY() + 1);
    }
}

 

 

 

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
 
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.mock;
 
@RunWith(PowerMockRunner.class)
@PrepareForTest(PowerMockDemo.class)
public class PowerMockDemoTest {
 
    private PowerMockDemo powerMockDemoSpy;
 
    @Before
    public void setUp() {
        powerMockDemoSpy = PowerMockito.spy(new PowerMockDemo());
    }
 
    @Test
    public void testMockPrivateMethod() throws Exception {
        Point mockPoint = mock(Point.class);
 
        PowerMockito.doReturn(mockPoint)
            .when(powerMockDemoSpy, "privateMethod", anyObject());
 
        Point actualMockPoint = powerMockDemoSpy.callPrivateMethod();
 
        assertThat(actualMockPoint, is(mockPoint));
    }
}

 或者

@Test
public void testCompose() {
    Train train = new Train();
    Train trainSpy = Mockito.spy(train);
    //notice different Mockito syntax for spy   
    Mockito.doReturn(TESTING_WAGON_COUNT).when(trainSpy).getWagonsCount();
    Mockito.doNothing().when(trainSpy).addWagon(0);
    // invoke testing method
    int actualWagonCount = trainSpy.compose();
    Assert.assertEquals(actualWagonCount, TESTING_WAGON_COUNT);
    Mockito.verify(trainSpy, Mockito.times(TESTING_WAGON_COUNT))
    .addWagon(0);
}

 

 网上找的的一些其他人的例子:

参考地址: http://chenjingbo.iteye.com/blog/1696488

    @Test  
    public void testCreateMarketingDetail() throws Exception {  
        PowerMockito.doReturn(marketingDetail).when(internalMarketingBuilder,"createMarketingDetail",marketingActivity);  
        Assert.assertTrue(umpDetailManager.createMarketingDetail(marketingActivity).getDetailId() == detailId);  
    }  
  
    @Test(expected = ManagerException.class)  
    public void testCreateMarketingDetail_Exception() throws Exception {  
        PowerMockito.doThrow(new RuntimeException("test")).when(internalMarketingBuilder, "createMarketingDetail", marketingActivity);  
        Assert.assertTrue(umpDetailManager.createMarketingDetail(marketingActivity).getDetailId() == detailId);  
    }  
  
    @Test(expected = ManagerException.class)  
    public void testCreateMarketingDetail_Exception2() throws Exception {  
        umpDetailManager.createMarketingDetail(null);  
    }  
  
    @Test  
    public void testAddMarketingDetail() throws Exception {  
        PowerMockito.doReturn(content).when(internalMarketingBuilder,"build",marketingDetail);  
        PowerMockito.doReturn(prepareResultSupport()).when(marketingActivityTopServiceClient,"addMarketingDetail",activityId,content,sellerId);  
        Assert.assertEquals(umpDetailManager.addMarketingDetail(activityId,marketingDetail,sellerId).getDefaultModel(),detailId);  
    }  
  
    @Test(expected = ManagerException.class)  
    public void testAddMarketingDetail_Exception() throws Exception {  
        PowerMockito.doReturn(content).when(internalMarketingBuilder,"build",marketingDetail);  
        PowerMockito.doThrow(new RuntimeException("test")).when(marketingActivityTopServiceClient,"addMarketingDetail",activityId,content,sellerId);  
        umpDetailManager.addMarketingDetail(activityId,marketingDetail,sellerId);  
    }  
  
    @Test  
    public void testDeleteMarketingDetail() throws Exception {  
        PowerMockito.doReturn(prepareResultSupport2()).when(marketingActivityTopServiceClient,"deleteMarketingDetail",detailId,sellerId);  
        Assert.assertFalse(umpDetailManager.deleteMarketingDetail(detailId,sellerId).isSuccess());  
    }  
  
    @Test(expected = ManagerException.class)  
    public void testDeleteMarketingDetail_Exception() throws Exception {  
        PowerMockito.doThrow(new RuntimeException("test")).when(marketingActivityTopServiceClient,"deleteMarketingDetail",detailId,sellerId);  
        Assert.assertFalse(umpDetailManager.deleteMarketingDetail(detailId,sellerId).isSuccess());  
    }  
  
    @Test  
    public void testUpdateMarketingActivityDetail() throws Exception {  
        PowerMockito.doReturn(content).when(internalMarketingBuilder,"build",marketingDetail);  
        PowerMockito.doReturn(prepareResultSupport2()).when(marketingActivityTopServiceClient,"updateMarketingDetail",detailId,content,sellerId);  
        Assert.assertFalse(umpDetailManager.updateMarketingActivityDetail(detailId,marketingDetail,sellerId).isSuccess());  
    }  
  
    @Test(expected = ManagerException.class)  
    public void testUpdateMarketingActivityDetail_Exception() throws Exception {  
        PowerMockito.doReturn(content).when(internalMarketingBuilder,"build",marketingDetail);  
        PowerMockito.doThrow(new RuntimeException("test")).when(marketingActivityTopServiceClient,"updateMarketingDetail",detailId,content,sellerId);  
        Assert.assertFalse(umpDetailManager.updateMarketingActivityDetail(detailId,marketingDetail,sellerId).isSuccess());  
    }  

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    node-v7.7.2-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    前后端分离的毕业论文(设计)管理系统 (SpringBoot+Vue)

    关于基于SpringBoot和Vue的毕业论文(设计)管理系统,到了一些相关的资源和示例项目,这些资源可能对您的毕业设计有所帮助。 1. **SpringBoot+Vue的三只松鼠商城**: 这个项目是一个基于SpringBoot和Vue的在线购物系统,采用了前后端分离的架构模式。系统实现了管理员模块和用户模块,包括用户管理、地址管理、订单管理、商品管理、支付功能等。这个项目是一个B2C电商平台,使用了MySQL和Redis数据库。 2. **大学生校园社团管理系统**: 这是一个基于SpringBoot和Vue的校园社团管理系统,旨在简化社团报名和组织活动的流程。系统包括用户管理、社团管理、活动信息管理等功能。该项目展示了如何使用前后端分离架构来构建一个校园社团管理系统。 3. **智慧宿舍管理系统**: 这个项目是基于SpringBoot和Vue的智慧宿舍管理系统,旨在提高宿舍管理的效率和便利性。系统包括学生宿舍信息管理、设备监控、安全管理和生活服务等功能。该项目展示了如何使用前后端分离架构来构建一个智能宿舍管理系统。 这些项目可以为您的毕业设计提供灵感和实际的技术指导。您可以

    238.html

    238.html

    基于tensorflow深度学习的地理位置的命名实体识别.zip

    基于tensorflow深度学习的地理位置的命名实体识别.zip

    优秀项目 基于STM32单片机+Python+OpenCV的二自由度人脸跟踪舵机云台源码+详细文档+全部数据资料.zip

    【资源说明】 优秀项目 基于STM32单片机+Python+OpenCV的二自由度人脸跟踪舵机云台源码+详细文档+全部数据资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    文件I/O基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

    文件I/O基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

    基于深度神经网络的图像分类任务.zip

    基于深度神经网络的图像分类任务.zip

    强化学习基准代码,已经针对Tensoflow2.x版本修改,可以直接使用

    强化学习基准代码,已经针对Tensoflow2.x版本修改,可以直接使用

    node-v7.7.4-linux-ppc64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    DZT0227-2010 地质岩心钻探规程.pdf

    DZT0227-2010 地质岩心钻探规程.pdf

    自动泊车之AVM环视系统算法及其框架.pdf

    自动泊车之AVM环视系统算法及其框架

    HTML+CSS+JS精品网页模板H70.rar

    HTML+CSS+JS精品网页模板,设置导航条、轮翻效果,鼠标滑动效果,自动弹窗,点击事件、链接等功能;适用于大学生期末大作业或公司网页的设计制作。响应式网页,可以根据不同的设备屏幕大小自动调整页面布局; 支持如Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件进行编辑修改; 支持包括IE、Firefox、Chrome、Safari主流浏览器浏览; 下载文件解压缩,用Dreamweaver、HBuilder、Text 、Vscode 等任意html编辑软件打开,只需更改源代码中的文字和图片可直接使用。图片的命名和格式需要与原图片的名字和格式一致,其他的无需更改。如碰到HTML5+CSS+JS等专业技术问题,以及需要对应行业的模板等相关源码、模板、资料、教程等,随时联系博主咨询。 网页设计和制作、大学生网页课程设计、期末大作业、毕业设计、网页模板,网页成品源代码等,5000+套Web案例源码,主题涵盖各行各业,关注作者联系获取更多源码; 更多优质网页博文、网页模板移步查阅我的CSDN主页:angella.blog.csdn.net。

    高分项目 基于STM32单片机的窗户控制系统APP源代码+项目资料齐全+教程文档.zip

    【资源概览】 高分项目 基于STM32的窗户控制系统APP源代码+项目资料齐全+教程文档.zip高分项目 基于STM32的窗户控制系统APP源代码+项目资料齐全+教程文档.zip高分项目 基于STM32的窗户控制系统APP源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!

    Windows 系统下 Xshell 安装使用教程

    附件是Windows 系统下 Xshell 安装使用教程,仅供交流学习使用,无任何商业目的! Xshell 是一款功能丰富的 SSH 客户端,除了基本的远程命令行访问,还提供了许多高级功能,如标签式界面、强大的脚本功能等。通过实践和探索,你可以更深入地了解 Xshell 的各种功能。

    node-v0.12.17-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.1.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于深度学习的机器翻译模型.zip

    基于深度学习的机器翻译模型.zip

    stm32 嵌入式RTOS

    e-kernel for stm32h7xx, 适用stm32h7xx系列MCU,简洁好用的嵌入式RTOS

    附件1-2-山东煤矿安全监察局_煤矿安全监控系统、煤矿井下作业人员管理系统联网规范.pdf

    附件1-2-山东煤矿安全监察局_煤矿安全监控系统、煤矿井下作业人员管理系统联网规范.pdf

    node-v7.7.2-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics