当前位置: 代码迷 >> 综合 >> 单元测试-PowerMockito的使用(2)-mock进阶
  详细解决方案

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

热度:110   发布时间:2023-11-14 03:45:53.0

单元测试-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对象都会直接注入到这个类中。
  希望写的文章对大家有帮助。

  相关解决方案