单元测试-PowerMockito的使用(2)-mock进阶

单元测试-PowerMockito的使用(2)-mock进阶

前言

上篇讲解了mock的简单实用,初步了解了mock,今天我们来了解一下进阶的使用方式。

一、Mock进阶使用

1.测试方法

/**
 * @version 1.0
 * @Description 方法mockDemo
 * @Author 残冬十九
 * @Date 2020/6/12
 */
public class MockStaticDemo {


	@Resource
	private 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 {


	@InjectMocks
	private MockStaticDemo mockStaticDemo;

	@Mock
	private StaticDemoTarget staticDemoTarget;

	/**
	 * 静态方法摸mock
	 */
	public void testAddition() {
		//mock静态类
		mockStatic(StaticDemoTarget.class);
		//如果使用了anyInt()的测试条件,就代表任何数据都可以满足条件。返回5
		when(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 {
		//设置最大值方法返回10
		when(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);
		//设置最大值方法返回10
		when(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对象都会直接注入到这个类中。
  希望写的文章对大家有帮助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章