使用Powermock工具mock静态方法代码示例

对于Mockito和Powrmock的一些使用介绍和配置可以看Mockito配合powermock工具mock构造函数这篇文章。

假如有Demo类的getName方法需要做单元测试,代码如下:

public class Demo {

    public String getName() {
        String name = "name";
        String str1 = "str1", str2 = "str2";
        if (name.equals(Tools.concat(str1, str2))) {
            name = "str";
        }
        return name;
    }
}

如果测试的时候并不需要关心Tools.concat(str1,str2)结果,所以需要对concat方法mock。

Tools类的代码如下:

public class Tools {

    public static String concat(String str1, String str2) {
        return str1 + str2;
    }
}

测试代码示例如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Tools.class})
public class DemoTest {

    @Test
    public void testGetName() {
        // 注意使用mockStatic,把这个类的静态方法都mock了
        PowerMockito.mockStatic(Tools.class);

        PowerMockito.when(Tools.concat("str1", "str2")).thenReturn("str");

        assertEquals("name", new Demo().getName());

    }
}

说明如下:

1. 类上使用注解@RunWith(PowerMockRunner.class)

2. 使用注解@PrepareForTest({Tools.class})-->>>这个注解的值是需要mock的类,@PrepareForTest的说明可以看Mockito配合powermock工具mock构造函数这篇文章。

3. 代码中调用mockStaic 方法:(注意,这样会把Tools类的所有静态方法mock了,其它静态方法不设定返回值的时候,调用的时候就会返回默认值了(这个问题可以考虑场景有多种方案解决,比如使用spy或者@PrepareForTest作用范围或者需要的时候mock其它静态方法设置返回值)。

PowerMockito.mockStatic(Tools.class);

4. mock concat方法设置期望的返回值:

PowerMockito.when(Tools.concat("str1", "str2")).thenReturn("str");

 

你可能感兴趣的:(测试,------》mockito)