资讯专栏INFORMATION COLUMN

Java单元测试入门

cfanr / 2466人阅读

摘要:三使用介绍通过代码创建通过注解四常用方法验证方法没有被调用验证方法被调用了次方法至少被调用次方法最多被调用次备注假如你无法给你程序写单元测试,那么意味着你的程序结构有问题,需要调整或重构。

Java单元测试入门

什么是单元测试

定义:单元测试是对软件或程序的基本(最小)组成单元的测试
对象:方法、类
特点:

为什么要写单元测试

需不需要写单元测试

只要程序能运行就可以了,写单元测试浪费时间
代码很简单不需要单元测试
我保证不会有什么问题的
测试人员测试一下就可以了
这次没有时间写了,下次补上吧

测试分类

单元测试->集成测试->端到端测试

各测试占比

Junit介绍

Junit例子

import org.junit.*;
import static org.junit.Assert.fail;

public class ClassNameTest {
    @BeforeClass    //公开表态无返回值
    public static void beforeClass() throws Exception{
        //每次测试类执行前执行一次,主要用来初使化公共资源等
    }
    @AfterClass     //公开表态无返回值
    public static void afterClass() throws Exception{
        //每次测试类执行完成后执行一次,主要用来释放资源或清理工作
    }
    @Before
    public void setup() throws Exception {
        //每个测试案例执行前都会执行一次
    }
    @After
    public void teardown() throws Exception {
        //每个测试案例执行完成后都会执行一次
    }
    @Test
    public void testMethodName_give_…_when_…_then_…() {
        fail("失败");
    }
}

常用注解

@Ignore 

    该注解标记的测试方法在测试中会被忽略

@Test

    @Test(expected=xxxException.class)   断言该方法会抛出异常
    @Test(timeout=1000)                  执行时间超过设置的值该案例会失败

@RunWith

    @RunWith(Suite.class)                 测试集运行器配合使用测试集功能
    @RunWith(JUnit4.class)                默认运行器
    @RunWith(Parameterized.class)         参数化运行器
    @RunWith(Suite.class)
    @Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class})

@Rule
public class ExpectedExceptionsTest {
    @Rule
    public ExpectedException thrown = ExpectedException.none();
    @Test
    public void verifiesTypeAndMessage() {
        thrown.expect(RuntimeException.class);
        thrown.expectMessage("Runtime exception occurred");
        throw new RuntimeException("Runtime exception occurred");
    }
}

参数化

@RunWith(Parameterized.class)
public class PrimeFactorTest {
    private PrimeFactor primeFactor;
    private int input;
    private List expected;
    //构造函数
    public PrimeFactorTest(int input, List expected) {
        this.input = input;
        this.expected = expected;
    }
    @Parameterized.Parameters
    public static Collection init() {
        return Arrays.asList(new Object[][]{
             {18, Arrays.asList(2, 3, 3)}
        });
    }
    @Test
    public void testFactor_when_input_18_then_must_return_2_3_3() {
        Assert.assertEquals(expected, primeFactor.factor(input));
    }
}

断言

常用的断言方法如下:
assertEquals(a, b)    测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

assertFalse(a)        测试a是否为false(假),a是一个Boolean数值。

assertTrue(a)         测试a是否为true(真),a是一个Boolean数值

assertNotNull(a)      测试a是否非空,a是一个对象或者null。

assertNull(a)         测试a是否为null,a是一个对象或者null。

assertNotSame(a, b)   测试a和b是否没有都引用同一个对象。

assertSame(a, b)      测试a和b是否都引用同一个对象。

fail(string)          Fail让测试失败,并给出指定信息。

assertThat(expected, Matcher)  通过Matcher断言

Hamcrest :greaterThan,greaterThanOrEqualTo,lessThan,anything,anyOf,containsString

建议

使用give when then方式命名你的测试方法名称。

一个案例只写一个断言。

要写注释,建议分为如下4步骤。

测试场景

准备数据

测试执行

断言

Mock介绍

一、mock就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。
Java常用Mock
EasyMock、JMock、PowerMock、Mockit等



二、Mock工具的原理
 mock工具工作的原理大都如下:

record阶段:录制期望。也可以理解为数据准备阶段。创建依赖的class 或interface或method ,模拟返回的数据,及调用的次数等。

replay阶段:通过调用被测代码,执行测试。期间会invoke 到 第一阶段record的mock对象或方法。

verify阶段:验证。可以验证调用返回是否正确。及mock的方法调用次数,顺序等。

三、Mockito使用介绍

通过代码创建
    1.    public class UserServiceTest {  
    2.        private UserService userService;  
    3.        private UserDao mockUserDao;  
    4.        @Before  
    5.        public void setUp() {
    6.            mockUserDao = mock(UserDao.class);  
    7.            userService = new UserServiceImpl();  
    8.            userService.setUserDao(mockUserDao);  
    9.        }
通过注解
    1.    public class UserServiceTest {  
    2.     
    3.        @InjectMocks
    4.        private UserServiceImpl userService;  
    5.      
    6.        @Mock  
    7.        private UserDao mockUserDao;  
    8.      
    9.        @Before  
    10.        public void setUp() {  
    11.            MockitoAnnotations.initMocks(this);  
    12.        }

四、Mockito常用方法

verify
    verify(mock, never()).add("twice");        验证add方法没有被调用
    verify(mock, times(2)).add("twice");       验证add方法被调用了2次
    verify(mock, atLeast(n)).someMethod();     方法至少被调用n次
    verify(mock, atMost(n)).someMethod();      方法最多被调用n次
when
    when(mock.someMethod()).thenReturn(value1).thenReturn(value2);
    when(mock.get(0)).thenReturn("first"); 
    when(mock.get(1)).thenThrow(new RuntimeException());
    when(mock.get(anyInt())).thenReturn("element"); 
spy
    List spy = spy(new LinkedList());
    when(spy.get(0)).thenReturn(“foo");
    doReturn("foo").when(spy).get(0);
备注
假如你无法给你程序写单元测试,那么意味着你的程序结构有问题,需要调整或重构。

对待测试代码要向生产代码一样,测试代码也需要重构和维护。

3Q

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71415.html

相关文章

  • Spring Boot快速入门(五):使用MyBatis(注解形式)进行数据库操作

    摘要:添加依赖新建项目选择三个依赖对于已存在的项目可以在加入,将会帮你自动配置好配置基本信息然后在下添加基本配置数据库连接地址数据库账号数据库密码数据库驱动创建实体创建一个实体,包含姓名年龄属性创建数据访问接口创建一个 添加依赖 新建项目选择web,MyBatis,MySQL三个依赖 showImg(https://segmentfault.com/img/bV2l1L?w=1684&h=1...

    lentoo 评论0 收藏0
  • Spring Boot 2.x基础教程:快速入门

    摘要:编写一个接口创建命名为根据实际情况修改创建类,内容如下启动主程序,使用等工具发起请求,可以看到页面返回编写单元测试用例打开的下的测试入口类。 简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让你更易上手,更简单快捷地构建Spring应...

    tigerZH 评论0 收藏0
  • Android单元测试 - 几个重要问题

    摘要:言归正传,上一篇文章单元测试如何开始介绍了几款单元测试框架基本用法依赖隔离概念,本篇主要解答单元测试中几个重要问题。在单元测试交流微信群,很多新进来的小伙伴,都会几个大同小异的问题。 showImg(/img/bVEpaD?w=1080&h=715); 原文链接:http://www.jianshu.com/p/f5d197a4d83a 前言 已经一个月没写文章了,由于9月份在plan...

    ChristmasBoy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<