對於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");