关于单元测试,其实你也可以这样来写

Posted 程序员小捣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于单元测试,其实你也可以这样来写相关的知识,希望对你有一定的参考价值。

关于PowerMock

在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito。可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决前面三种框架不能解决的问题,而且powermock也是是单元测试中极其强大的测试框架。

PowerMock特点

主要围绕着Junit、TestNg测试框架开展进行
对所依赖的Jar包非常的苛刻,出现jar包的冲突或者不一致就不能使用
PowerMock也是一种Mock,主要是解决其他Mock不能解决的问题,通俗的讲,就是专治各种不服
PowerMock入门实例

1、引入依赖jar包

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.1</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
       <version>1.6.1</version>
    <scope>compile</scope>
</dependency>

2、代码实现

模拟新增学生操作,先建一个名为StudentService的类,用来模拟服务调用操作,在这个类中新增一个方法,来模拟查询总共有多少个学生,具体示例代码如下:

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:13
 */
public class StudentService {
    private StudentDao studentDao;

    public StudentService(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    /**
     * 获取学生个数
     *
     * @param studentDao
     */
    public int getTotal(StudentDao studentDao) {
        return studentDao.getTotal();
    }
}

可以看出创建service需要传递StudentDao这个类,接着我们再来创建StudentDao这个类,用于进行新增操作生,具体示例代码如下:

package com.rongrong.powermock.dao;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:15
 */
public class StudentDao {
    public int getTotal() {
        throw new UnsupportedOperationException();
    }
}

仔细看,你会发现,你肯定调不了dao了,这回傻了吧,哈哈哈!!!

你会好奇这块为啥我要抛出UnsupportedOperationException异常呢?

因为我就想模拟服务不可用的情况(实际中经常会遇到可能由于某种原因(没有完成,或者资源不存在等)无法为 Service 服务),这样的情况。难道我们就不测试了吗?

那我还是乖乖的把测试用例写完,并测试下吧,下面我们再来创建一个名为StudentServiceTest的测试类,具体示例代码如下:

package com.rongrong.powermock.service;

import com.rongrong.powermock.dao.StudentDao;
import org.testng.annotations.Test;

/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:19
 */
public class StudentServiceTest {
    @Test
    public void testAddStudent() {
        StudentDao studentDao = new StudentDao();
        StudentService studentService = new StudentService(studentDao);
        studentService.getTotal(studentDao);
    }

}

上面的测试用例肯定会执行失败,那我们也来执行下看,效果如下图:
我们先将这个报错,脑补为链接不上数据库,问题很明显,数据库挂了,就是连接不上了,等着服务器好了得三天后,可是今晚领导就要看功能实现,你该怎么办?无法测试service,难道就真的结束了吗?

答案是否定的,此时我们用PowerMock便可完美解决问题,接下来我们请出PowerMock登场,使用PowerMock进行测试,具体代码如下:

package com.rongrong.powermock.service;
import com.rongrong.powermock.dao.StudentDao;
import org.powermock.api.mockito.PowerMockito;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
 * @author rongrong
 * @version 1.0
 * @date 2019/11/17 21:19
 */
public class StudentServiceTest {
    @Test
    public void testGetStudentTotal() {
        StudentDao studentDao = PowerMockito.mock(StudentDao.class);
        PowerMockito.when(studentDao.getTotal()).thenReturn(666);
        StudentService studentService = new StudentService(studentDao);
        int total = studentService.getTotal(studentDao);
        Assert.assertEquals(total, 666);
    }
}

这时再次运行,你会发现神奇般的运行通过,结果如下图所示:
是不是很神奇,很惊喜,没错,这个框架就是这么强大。

3、总结

我们可以这样理解mock就是创建一个假的该对象,然后需要你告诉这个对象调用某个方法的时候返回某个你指定的值即可。

到此,一个简单PowerMock入门结束,如您觉得好,请继续关注我,谢谢支持!

最后:【可能给予你一定的帮助】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
关注我的微信公众号【软件测试小dao】免费获取~

我的学习交流群:644956177 群里有技术大牛一起交流分享~

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

以上是关于关于单元测试,其实你也可以这样来写的主要内容,如果未能解决你的问题,请参考以下文章

20171005-构建之法:现代软件工程-阅读笔记

构建之法阅读笔记03

关于js----------------分享前端开发常用代码片段

读书笔记三

程序员自己写测试,还要测试人员做什么?

第1129期对vue.js单文件(.vue)进行单元测试