单元测试-PowerMockito的使用(2)-mock进阶
- 前言
- 一、Mock进阶使用
-
- 1.测试方法
- Mock方法
前言
上篇讲解了mock的简单实用,初步了解了mock,今天我们来了解一下进阶的使用方式。
一、Mock进阶使用
1.测试方法
/*** @version 1.0* @Description 方法mockDemo* @Author 残冬十九* @Date 2020/6/12*/
public class MockStaticDemo {
@Resourceprivate StaticDemoTarget staticDemoTarget;/*** 加法,求两数之和** @param a 数值A* @param b 数值B* @return 两数之和*/public int addition(int a, int b) {
return a + StaticDemoTarget.multiply(b);}/*** 加法,获取a和ab中最大值的和,new出来的对象** @param a 数值A* @param b 数值B* @return 两数之和*/public int sum(int a, int b) {
return a + new StaticDemoTarget().max(a, b);}/*** 加法,获取a和ab中最大值的和,引用的对象** @param a 数值A* @param b 数值B* @return 两数之和*/public int sumResource(int a, int b) {
return a + staticDemoTarget.max(a, b);}
}class StaticDemoTarget {
/*** 乘法,将数值A乘以3并返回** @param a 数值A* @return 数值a乘以三之后的值*/public static int multiply(int a) {
return a * 3;}/*** 获取最大值** @param a 数值A* @param b 数值B* @return 最大值*/public int max(int a, int b) {
return Math.max(a, b);}
}
Mock方法
/*** @version 1.0* @Description mock实例* @Author 残冬十九* @Date 2020/6/12*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({
StaticDemoTarget.class, MockStaticDemo.class})
public class MockStaticDemoTest extends TestCase {
@InjectMocksprivate MockStaticDemo mockStaticDemo;@Mockprivate StaticDemoTarget staticDemoTarget;/*** 静态方法摸mock*/public void testAddition() {
//mock静态类mockStatic(StaticDemoTarget.class);//如果使用了anyInt()的测试条件,就代表任何数据都可以满足条件。返回5when(StaticDemoTarget.multiply(anyInt())).thenReturn(5);//下面进行断言Assert.assertEquals(6, mockStaticDemo.addition(1, 2));System.out.println("testAddition结束");}/*** new 出对象mock** @throws Exception*/public void testSum() throws Exception {
//设置最大值方法返回10when(staticDemoTarget.max(anyInt(), anyInt())).thenReturn(10);whenNew(StaticDemoTarget.class).withNoArguments().thenReturn(staticDemoTarget);//下面进行断言Assert.assertEquals(11, mockStaticDemo.sum(1, 2));System.out.println("testSum结束");}/*** 引用出来对象mock** @throws Exception*/public void testSumResource() throws Exception {
// mock一个需要resource的对象StaticDemoTarget staticDemoTarget = mock(StaticDemoTarget.class);//将兑现赋值进去Whitebox.setInternalState(mockStaticDemo, "staticDemoTarget", staticDemoTarget);//设置最大值方法返回10when(staticDemoTarget.max(anyInt(), anyInt())).thenReturn(10);whenNew(StaticDemoTarget.class).withNoArguments().thenReturn(staticDemoTarget);//下面进行断言Assert.assertEquals(11, mockStaticDemo.sumResource(1, 2));System.out.println("testSumResource结束");}}
上图中可以看出,我们有静态方法,代码中new出来的对象,还有引用的对象三种mock方式,这三种方法也是比较常用的方法。
需要注意的是PrepareForTest注解,需要mock静态方法的时候。必须使用PrepareForTest注解,并且在注解后跟上需要mock静态方法对应的静态类。如果使用PrepareForTest注解,就一定要配套使用RunWith注解才行。
InjectMocks注解是注解需要测试的类,其他mock对象都会直接注入到这个类中。
希望写的文章对大家有帮助。