一、单元测试框架简介
Mockito是一个Mock框架,也是Java中使用比较广泛的一个Mock框架。关于Mock的概念,其实很简单:所谓的mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到以下目的:
- 验证这个对象的某些方法的调用情况,调用了多少次,参数是什么等等;
- 指定这个对象的某些方法的行为,返回特定的值,或者是执行特定的动作,而不用像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");