对于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");