使用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");

 

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