Java单元测试

本文介绍了Mockito和PowerMockito这两个单元测试框架,讲解了如何使用它们进行类和方法的mock,包括验证方法调用、指定行为、模拟静态方法等。同时,文章还阐述了单元测试的命名规范和结构,以及断言的使用方法,为Java开发者提供了详细的单元测试指导。
摘要由CSDN通过智能技术生成

一、单元测试框架简介

Mockito是一个Mock框架,也是Java中使用比较广泛的一个Mock框架。关于Mock的概念,其实很简单:所谓的mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到以下目的:

  1. 验证这个对象的某些方法的调用情况,调用了多少次,参数是什么等等;
  2. 指定这个对象的某些方法的行为,返回特定的值,或者是执行特定的动作,而不用像AndroidTest那样必须在Android模拟器或物理机上进行测试;

而PowerMockito是对Mockito的增强,对于Mocktio不能Mock的对象或者方法,我们可以使用PowerMock来实现。比如Mockito不能用于static method, final method, 枚举类, private method,这些我们都可以用PowerMockito来实现。

二、命名规范

项目通用规范
{className}Test
方法test_{methodName}_should_{expection}_when_{condition}

三、测试结构

注解说明
@RunWith为测试类指定测试执行器
@PrepareForTest修改指定类的字节码
@BeforeClass在所有测试用例执行之前执行一次
@AfterClass在所有测试用例执行之后执行一次
@Before在每个测试用例执行之前执行一次
@After在每个测试用例执行之后执行一次
@Test执行测试用例

四、断言的使用

断言说明
Assert.assertEquals(Object expected, Object actual)断言两个对象相等
Assert.assertTrue(boolean condition)断言condition为true
Assert.assertFalse(boolean condition)断言condition为false
Assert.assertNull(Object object)断言对象为null
Assert.assertNotNull(Object object)断言对象不为null

五、常见写法

1、对类进行mock

// 对普通类进行mock
ClassName object = PowerMockito.mock(ClassName.class);

// 对含有静态方法的类进行mock
PowerMockito.mockStatic(ClassName.class);

2、对构造方法进行mock

ClassName object = PowerMockito.mock(ClassName.class);
PowerMockito.whenNew(ClassName.class).withArguments(arguments).thenReturn(object);

注意:

(1)此时需要在测试类的@PrepareForTest中加入ClassName.class,否则上述mock不会生效;

(2)withArguments可以替换成withNoArguments或者withAnyArguments,视具体情况而定。

3、对有返回值的public成员方法进行mock

// 对普通成员方法进行mock
ClassName object = PowerMockito.mock(ClassName.class);
PowerMockito.when(object.publicMemberMethod()).thenReturn(expectedValue);

// 对静态成员方法进行mock
PowerMockitoStatic(ClassName.class);
PowerMockito.when(ClassName.publicMemberMethod()).thenReturn(expectedValue);

注意:对静态成员方法进行mock时需要在测试类的@PrepareForTest中加入ClassName.class,否则上述mock不会生效。

4、跳过有返回值的成员方法(public或者private)

Stubber.stubMethod(ClassName.class, "memberMethodName", expectedValue);

5、跳过无返回值的public成员方法

// 跳过普通无返回值public成员方法
ClassName object = PowerMockito.mock(ClassName.class);
PowerMockito.doNothing().when(object).publicMemberMethod(arguments);

// 跳过静态无返回值public成员方法方式一
PowerMockito.mockStatic(ClassName.class);
PowerMockito.doNothing().when(ClassName.class, "publicMemberMethodName", arguments...);
// 跳过静态无返回值public成员方法方式二
PowerMockito.suppress(PowerMockito.method(ClassName.class, "publicMemberMethodName", argumentsType.class...));

注意:

(1)跳过静态无返回值的public成员方法时需要在测试类的@PrepareForTest中加入ClassName.class,否则上述mock不会生效。

(2)跳过静态无返回值public成员方法时如果是无参数的,那么方式一的arguments...和方式二的argument.class无需传入。

6、没有set方法的情况下设置私有成员变量的值

ClassName object = PowerMockito.mock(ClassName.class);
Whitebox.setInternalState(object, "privateMemberVariableName", expectedValue);

7、没有get方法的情况下获取私有成员变量的值

ClassName object = PowerMockito.mock(ClassName.class);
Whitebox.getInternalState(object, "privateMemberVariableName");

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值