測試靜態方法

說明

  • 測試靜態方法需要其他 Library 來輔助,在這裡用了 PowerMock ,gradle 設定如下
    testCompile 'org.powermock:powermock-module-junit4:1.6.2'
    testCompile 'org.powermock:powermock-api-mockito:1.6.2'

範例

假設現在要實作一個發送驗證碼到電子信箱的功能,那麼程式碼可能會是如下:

public class VerificationPresenter {

    private ServerModel serverModel;
    private VerificationView view;

    public void sendVerification(String email){
        if(Utils.isEmail(email)){
            serverModel.sendVerification(email, view);
        }else{
            view.showWarning();
        }
    }
}

在這裡呼叫了一個共用的靜態方法:isEmail。用來檢查電子信箱是否有效

在 Utils.isEmail 裡有很複雜的撿查邏輯。驗證這靜態方法的邏輯應該在 UtilsTest 裡完成,而不是在 VerificationPresenterTest。所以這裡所關注的只有:回傳是值 True 還是 False,以及相對應的行為。

目標

如果是有效的 Email,就送出驗證碼。反之則顯示警告。

開始測試

1. 事前準備

@RunWith(PowerMockRunner.class)
//1. 要使用 PowerMock來執行測試時需指定 Runner為 PowerMockRunner
@PrepareForTest(Utils.class)
//2. 靜態方法的目標class
public class VerificationPresenterTest {

    @Test
    public void sendVerification() throws Exception {
        PowerMockito.mockStatic(Utils.class)
        //3. 靜態方法的目標class
        ...
    }

}

要使用PowerMock來測試靜態方法時比較麻煩,需設定

1. @RunWith
  1. @PrepareForTest
  2. mockStatic()

2. 建立需驗證互動的 class

    @Mock
    private ServerModel serverModel;

    @Mock 
    private VerificationView verificationView;

由於這裡已經使用了 PowerMockito,就不用執行 MockitoAnnotations.initMocks(this)

3. 完成測試

  1. email格式錯誤
    @Test
    public void invalidEmail_should_showWarning() throws Exception {
        PowerMockito.mockStatic(Utils.class);
        //arrange
        String email = "[email protected]";
        Mockito.when(Utils.isEmail(email)).thenReturn(false);
        //這裡的用法跟Mockito一樣
        //act
        VerificationPresenter verificationPresenter = new VerificationPresenter(serverModel, verificationView);
        verificationPresenter.sendVerification(email);
        //assert
        Mockito.verify(verificationView).showWarning();
    }
  1. email格式正確
    @Test
    public void validEmail_should_sendVerification() throws Exception {
        PowerMockito.mockStatic(Utils.class);
        //arrange
        String email = "[email protected]";
        Mockito.when(Utils.isEmail(email)).thenReturn(true);
        //act
        VerificationPresenter verificationPresenter = new VerificationPresenter(serverModel, verificationView);
        verificationPresenter.sendVerification(email);
        //assert
        Mockito.verify(serverModel).sendVerification(email, verificationView);
    }

完成!!執行測試看看吧!

results matching ""

    No results matching ""